我试图以.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']
注意缩进的区别。而不是在with
循环中执行第二个for
,而是在相同的缩进级别执行,即在完成循环之后。
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)
另请注意我们如何在mylist
循环之前创建for
;你会在循环中覆盖这个列表的前一个值(也是)。如评论中所述,我还将writerow
更改为writerows
以写入所有收集的行。
将@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