[英]How do I dynamically create a list of target filenames in a loop?
我正在尝试以.csv格式创建其中具有特定字符串的文件列表,但是尽管循环会打印每个文件名,但我的列表仅存储所有文件名中的最后一个。
我试过创建一个列表,然后将其输出为csv,但输出的唯一内容是列表的最后一个元素。
for fname in glob.glob('*.txt'):
if os.path.isfile(fname):
with open(fname) as f:
for line in f:
if 'target' in line:
mylist = []
mylist.append(fname)
#print ('found code in file %s' %fname)
print(mylist)
with open("out.csv","w") as l:
wr = csv.writer(l,delimiter="\n")
wr.writerow(mylist)
break
此代码的输出是
['target_1.txt']
['target_3.txt']
我希望这是csv格式,但是当我查看out.csv文件时,该文件中只有target_3.txt。 我想要的是带有行的csv:
['target_1.txt']
['target_3.txt']
以@JonClements的评论并发布作为答案,可以更轻松地理解他在说什么。
with open("out.csv","w") as l: # Open "out.csv" ONCE
for fname in glob.glob('*.txt'):
if os.path.isfile(fname):
with open(fname) as f:
for line in f:
if 'target' in line:
mylist = []
mylist.append(fname)
#print ('found code in file %s' %fname)
print(mylist)
wr = csv.writer(l,delimiter="\n")
wr.writerows(mylist)
break
注意缩进的区别。 与其在for
循环内执行第二步with
不如在循环完成后以相同的缩进级别执行。
mylist = []
for fname in glob.glob('*.txt'):
if os.path.isfile(fname):
with open(fname) as f:
for line in f:
if 'target' in line:
mylist.append(fname)
#print ('found code in file %s' %fname)
break
with open("out.csv","w") as l:
wr = csv.writer(l,delimiter="\n")
wr.writerows(mylist)
还要注意我们如何在for
循环之前创建mylist
; 您将在循环内覆盖该列表的先前值(也是如此)。 如评论中所述,我还将writerow
更改为writerows
以写入所有收集的行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.