我正在编写Python代码,希望对如何解决此问题有更多的了解。
我试图读取多个文件以.log结尾。这样,我希望将特定的值写入.csv文件。
在文本文件中,有以下提取的X / Y值:
Textfile.log:
X/Y = 5
X/Y = 6
Textfile.log.2:
X/Y = 7
X/Y = 8
CSV文件中的DesiredOutput:
5
6
7
8
这是到目前为止我提出的代码:
def readfile():
import os
i = 0
for file in os.listdir("\mydir"):
if file.endswith(".log"):
return file
def main ():
import re
list = []
list = readfile()
for line in readfile():
x = re.search(r'(?<=X/Y = )\d+', line)
if x:
list.append(x.group())
else:
break
f = csv.write(open(output, "wb"))
while 1:
if (i>len(list-1)):
break
else:
f.writerow(list(i))
i += 1
if __name__ == '__main__':
main()
我对如何使其读取.log文件,然后读取.log.2文件感到困惑。是否可以让它自动读取1个目录中的所有文件,而无需分别键入它们?
更新:我正在使用Windows 7和Python V2.7
顺序读取文件的最简单方法是建立一个列表,然后在其上循环。就像是:
for fname in list_of_files:
with open(fname, 'r') as f:
#Do all the stuff you do to each file
这样,您所做的读取每个文件的任何操作都会重复,并应用于中的每个文件list_of_files
。由于列表是有序的,因此其排序顺序与列表排序的顺序相同。
借用@ The2ndSon的答案,您可以使用拾取文件os.listdir(dir)
。这将简单地dir
以任意顺序列出所有文件和目录。您可以从中拉出并订购所有文件,如下所示:
allFiles = os.listdir(some_dir)
logFiles = [fname for fname in allFiles if "log" in fname.split('.')]
logFiles.sort(key = lambda x: x.split('.')[-1])
logFiles[0], logFiles[-1] = logFiles[-1], logFiles[0]
上面的代码将与文件名(诸如此类)一起"somename.log", "somename.log.2"
使用。然后logFiles
,您可以将其作为插入并插入list_of_files
。请注意,仅当第一个文件"somename.log"
不是时,最后一行才是必需的"somename.log.1"
。如果第一个文件的末尾有数字,则只需排除最后一步
逐行说明:
allFiles = os.listdir(some_dir)
此行将其中的所有文件和目录some_dir
作为列表返回
logFiles = [fname for fname in allFiles if "log" in fname.split('.')]
执行列表推导,以收集log
名称中带有扩展名的所有文件。"something.log.somethingelse"
将包括在内,"log_something.somethingelse"
不会。
logFiles.sort(key = lambda x: x.split('.')[-1])
按最后一个扩展名对日志文件列表进行排序。x.split('.')[-1]
将文件名拆分为以句点分隔的值的列表,并获取最后一个条目。如果名称为"name.log.5"
,则将按排序"5"
。如果名称为"name.log"
,则将按排序"log"
。
logFiles[0], logFiles[-1] = logFiles[-1], logFiles[0]
交换日志文件列表的第一个和最后一个条目。这是必需的,因为排序操作将"name.log"
作为最后一个条目和第一个条目"nane.log.1"
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句