2017-07-27 46 views
-3

我有一個文件夾擁有超過15,000個csv文件。它們都有不同數量的列名。從csv文件讀取列名並保存爲列表時出錯

大多數文件都有它的第一行作爲列名(數據屬性)是這樣的:

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

我想要做的是閱讀的所有文件的第一行,將它們存儲爲列表,並寫該列表顯示爲新的csv文件。

這是我迄今所做的:

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) 

當我嘗試這個代碼,結果出來是這樣的:

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

因此在做CSV,每個文件的所有屬性要通過量時 New CSV file made

此外:進入第二列,這使其看起來像這樣(出於某種原因,有一間空行) h文件,我得到了另一個錯誤:

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

所以我在第一行中包含此代碼,但它沒有工作,說文件無效。

import codecs 
files=glob.glob('C:/example/*.csv') 
fileObj = codecs.open(files, "r", "utf-8") 

我閱讀關於stackflow的答案,但找不到與我的問題有關的答案。我感謝你的回答。

+0

首先,你不應該使用'list'作爲變量名稱。 –

+0

如果我正確理解你的目標,試着用'a = next(reader)'替換'a = [file,f.readline()]',並讓我知道它是否有效。 –

+0

另外,你使用'with ... as ...'跟隨你的outfile執行好的上下文管理器練習,但是你也應該對每個infile都這樣做。 –

回答

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) 

這裏你打開該文件,然後創建一個與列標題的列表作爲字符串(注意這意味着他們會像「列1,列2」)和文件名。因此,[( 「文件名」, 「列1,列2」)] 所以你會需要拆分的 '' 像:

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 
+0

感謝您的回答。 '和'split'。仍然,輸出是列1與文件名和列2與所有屬性。我想我解釋錯了因爲我的英語不太好。我想要做的是[(「文件名」,「Column1」,「Column2」],所以每個屬性將使新的csv文件中的列 –

+0

對不起,我搞砸了,我更新了代碼,你需要連接在列表中的列表中仍然是一個列表 –

+0

用你寫的最後一個代碼,我應該在'f.readline()'旁邊添加'split(',')'right?使用'+因爲TypeError說不能將列表轉換爲str –

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) 

這將寫有每INFILE一排新的CSV,每一行是filename, column1, column2, ...

+0

感謝您的幫助!但每行之間仍有空間。你知道如何解決這個問題嗎?以及如何從文件名剝離目錄? –

+0

不確定是否有空格,但是'file = file [file.rfind('\\')+ 1:]'會將文件名剝離爲最後一個反斜槓後面的內容 –

+0

它很好用。只需修復空格和'UnicodeDecodeError:'cp949'codec'。再次感謝! –

相關問題