从csv文件中读取列名并保存为列表时出错

时间:2017-07-27 03:03:43

标签: python list csv

我有一个包含超过15,000个csv文件的文件夹。它们都有不同数量的列名。

大多数文件的第一行作为列名(数据属性),如下所示:

...object

我想要做的是读取所有文件的第一行,将它们存储为列表,并将该列表写为新的csv文件。

这是我到目前为止所做的:

Name Date Contact Email 
a     b     c       d
a2    b2    c2      d2

当我尝试使用此代码时,结果如下:

import csv
import glob 
list=[]
files=glob.glob('C:/example/*.csv')
for file in files :
    f = open(file)
    a=[file,f.readline()]
    list.append(a)

with open('test.csv', 'w') as testfile:
     csv_writer = csv.writer(testfile)
     for i in list:
         csv_writer.writerow(i)

因此,在一个make csv中,每个文件的所有属性都进入第二列,使它看起来像这样(出于某种原因,它们之间是空行): New CSV file made

此外,在浏览文件时,我遇到了另一个错误:

[('C:/example\\example.csv', 'Name,Date,Contact,Email\n'), ('C:/example\\example2.csv', 'Address,Date,Name\n')]

所以我在第一行包含了这段代码,但它没有说文件是无效的。

UnicodeDecodeError: 'cp949' codec can't decode byte 0xed in position 6: illegal multibyte sequence

我在stackflow上阅读了答案,但我找不到与我的问题相关的答案。我很感激你的回答。

2 个答案:

答案 0 :(得分:0)

好的,所以

import csv
import glob 
list=[]
files=glob.glob('C:/example/*.csv')
for file in files :
    f = open(file)
    a=[file,f.readline()]
    list.append(a)

在这里你打开文件,然后创建一个列标题为列的字符串(注意这意味着它们看起来像" Column1,Column2")和文件名。所以[("文件名"," Column1,Column2")] 因此,您需要将其拆分为','像:

for file in files :
    f = open(file)
    a=[file] + f.readline().split(',')

现在我们有:

["filename", ("Column1", "Column2")]

所以它仍然会打印错误的文件。我们需要连接列表。

    a=[file] + f.readline().split(',')

所以我们得到:

 ["filename", "Column1", "Column2"]

您应该在使用f.close()打开文件后关闭每个文件,或者在循环中使用上下文管理器,如:

for file in files :
    with open(file) as f:
        a=[file] + f.readline()
        list.append(a)

更好的解决方案以及我将如何编写它:

import csv
import glob

files = glob.glob('mydir/*.csv')
lst = list()

for file in files:
    with open(file) as f:
        reader = csv.reader(f)
        lst.append(next(reader))


try:
    with open(files,'r'.encoding='utf8') as f:
        # do things
except UnicodeError:
    with open(files,'r'.encoding='utf8') as f:
        # do things

答案 1 :(得分:0)

一点点整理,适当的上下文管理,并使用csv.reader

import csv
import glob 
list=[]
files=glob.glob('C:/example/*.csv')
with open('test.csv', 'w') as testfile:
    csv_writer = csv.writer(testfile)
    for file in files:
        with open(file, 'r') as infile:
            reader = csv.reader(infile)
            headers = next(reader)
            lst = [file] + headers
            writer.writerow(lst)

这会写一个新的csv,每个infile一行,每行filename, column1, column2, ...