[英]Write multiple lists into csv. file in Python
我是Python(以及所有編程)的新手。 我編寫了一個簡短的程序,將專用文件夾的文件名讀取為字符串。 之后,我“提取”文件名中的信息(例如,文檔編號,標題等->稍后在示例中稱為value1,value 2等)。
之后,我將值存儲到列表中。 每個文件的一個列表(通過循環生成)如下:['value1','value 2','value3']
使用“打印”,我得到想要顯示的列表:
[‘value1‘, ‘value 2‘, 'value3'] (# generated from file 1)
[‘value1‘, ‘value 2‘, 'value3'] (# generated from file 2)
[‘value1‘, ‘value 2‘, 'value3'] (# generated from file 3)
[‘value1‘, ‘value 2‘, 'value3'] (# generated from file 4)
[‘value1‘, ‘value 2‘, 'value3'] (# generated from file 5)
現在,我想將列表存儲到這樣的csv.file中:
value1, value2, value3, (# generated from file 1)
value1, value2, value3, (# generated from file 2)
value1, value2, value3, (# generated from file 3)
value1, value2, value3, (# generated from file 4)
value1, value2, value3, (# generated from file 5)
我已經在網上搜索了可能的解決方案。 我已經嘗試了幾樣東西,但是只獲取了生成的最后一個列表。
我嘗試過的一次嘗試:
import os
import csv
def go():
folder = folderentry.get() # reads path for 'folder'
for path, subdirs, files in os.walk(folder):
for name in files:
searchValue1 = name.find("value1")
if searchValue1 >= 0:
parameter1 = "value 1"
else:
parameter = "NOT FOUND!"
searchValue2 = name.find("value2")
if searchValue1 >= 0:
parameter2 = "value 2"
else:
parameter = "NOT FOUND!"
searchValue3 = name.find("value3")
if searchValue3 >= 0:
parameter3 = "value 3"
else:
parameter = "NOT FOUND!"
list2 = []
list2.append(parameter1)
list2.append(parameter2)
list2.append(parameter3)
print(list2) # delivers the lists lik I want them
# generate csv.file:
with open('some.csv', 'wb') as f:
writer = csv.writer(f)
list3 = zip(list2)
writer.writerows(list3)
(list2是在其中定義列表的變量)使用此代碼,我得到:
value1
value2
value3
...
我希望這是一個循環,但我無法解決。
問題在於線路-
with open('some.csv', 'wb') as f: #Using `w` mode overwrites the file everytime
...
list3 = zip(list2) #This does not do what you think it does.
writer.writerows(list3) #This expects a list of rows, and writes each row on a single line.
首先, list2
是一維字符串列表(根據您創建的字符串而定。直接在此類列表上使用zip()
,會返回一個元組列表,每個元組都有每個元素。示例-
>>> zip(['asd','sdf','dfg'])
[('asd',), ('sdf',), ('dfg',)]
您不需要這樣做。 其次,在此之后,您使用writer.writerows()
,這會將list3
每個元組寫入一行, list3
每個元組視為一行。 您要在此處使用writer.writerow()
。 范例-
with open('some.csv', 'ab') as f:
writer = csv.writer(f)
writer.writerow(list2)
您可以構造一個列表列表,然后將其傳遞給csv.writer.writerows()
。 每個嵌套列表都對應於從每個文件名中提取的值。 目標是這樣的數據結構:
data = [['value1', 'value 2', 'value3'],
['value1', 'value 2', 'value3'],
['value1', 'value 2', 'value3']]
可以使用csv.writer,writerows(data)
將data
直接寫入CSV文件。 這是一些應該執行您想要的代碼:
import os
import csv
def go():
search_strings = ('value1', 'value2', 'value3') # target strings to be found in file name
data = []
folder = folderentry.get() # reads path for 'folder'
for path, subdirs, files in os.walk(folder):
for name in files:
extracted_strings = []
for s in search_strings:
if s not in name:
s = 'NOT FOUND!'
extracted_strings.append(s)
data.append(extracted_strings)
with open('some.csv', 'wb') as f:
writer = csv.writer(f)
writer.writerows(data)
這段代碼建立了一個列表( data
)列表,然后通過一次操作將其寫入CSV文件。 上面代碼的一種改進是使用列表推導為每個文件名創建值列表,並將其直接附加到data
列表中。 這效率更高並且使用的代碼更少,但是第一個示例也許對您更容易理解:
import os
import csv
def go():
search_strings = ('value1', 'value2', 'value3') # target strings to be found in file name
data = []
folder = folderentry.get() # reads path for 'folder'
for path, subdirs, files in os.walk(folder):
for name in files:
data.append([s if s in name else 'NOT FOUND!' for s in search_strings])
with open('some.csv', 'wb') as f:
writer = csv.writer(f)
writer.writerows(data)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.