簡體   English   中英

將多個列表寫入csv。 Python文件

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM