[英]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.