我正在编写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
答案 0 :(得分:1)
按顺序读取文件的最简单方法是构建一个列表然后循环它。类似的东西:
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"
作为第一个条目。
答案 1 :(得分:1)
如果更改日志文件的命名方案,则可以轻松返回具有“.log”扩展名的文件列表。例如,如果将文件名更改为Textfile1.log和Textfile2.log,则可以将readfile()更新为:
import os
def readfile():
my_list = []
for file in os.listdir("."):
if file.endswith(".log"):
my_list.append(file)
print my_list将返回['Textfile1.log','Textfile2.log']。通常避免使用单词'list'作为变量,因为它也用于python中的对象。