将多个列表写入csv。Python中的文件

2024-05-16 02:07:17 发布

您现在位置: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
...

我想需要一个循环,但我无法理解。


Tags: csvnamefrom列表forvaluefolderfind
2条回答

您可以构造一个列表列表,然后将其传递给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)

问题在于台词-

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',)]

你不需要这么做。其次,使用^{}之后,将list3中的每个元组写入一行,将每个元组视为一行。你想在这里使用^{}。示例-

with open('some.csv', 'ab') as f:
    writer = csv.writer(f)
    writer.writerow(list2)

相关问题 更多 >