2017-08-01 139 views
0

領域的最大數目我有我的文件夾中的200個CSV文件。 我想要做的是讀取每個文件的第一行並寫入新的csv。 和頂部,我想寫[文件,字段1,字段2,...字段N] n是場的最大數量。Python的CSV作家 - 寫在新的CSV文件列高達CSV文件

import csv 
import glob 
list=[] 
hel=[] 
files=glob.glob('C:/dataset/*.csv') 
with open('test.csv', 'w',newline='') as testfile: 
    csv_writer = csv.writer(testfile) 
    for file in files: 
     with open(file, 'r') as infile: 
      file=file[file.rfind('\\')+1:] 
      file=file.strip('.csv') 
      reader = csv.reader(infile) 
      headers = next(reader) 
      hel.append((len(headers))) 
      max(hel) 
      lst = [file] + headers 
      csv_writer.writerow(lst) 

後來才知​​道的200個文件字段最大數是255 因此,對新的CSV文件的頂部,我想寫file, field1, field2 ... field 255. 我怎樣才能做到這一點?


import csv 
import glob 
list=[] 
hel=[] 
files=glob.glob('C:/dataset/*.csv') 
with open('test.csv', 'w',newline='') as testfile: 
    csv_writer = csv.writer(testfile) 
    for file in files: 
     with open(file, 'r') as infile: 
      file=file[file.rfind('\\')+1:] 
      file=file.strip('.csv') 
      reader = csv.reader(infile) 
      headers = next(reader) 
      hel.append((len(headers))) 
      b=['field{}'.format(i) for i in range(1,max(hel)+1)] 
      lst = [file] + headers 
      csv_writer.writerow(lst) 

現在b是列表看起來像這樣[「字段1」,「字段2」 ...「field255」] 我需要插入之前「字段1」文件「,並寫上該行新的csv文件的頂部。在csv_writer.writerow(lst)之後編寫代碼可以讓我隔行掃描'field1','field2'.. csv文件。我該如何解決這個問題

+0

獲取文件名沒有父目錄的路徑,使用'os.basename',並使用'os.splitext'到文件名分成主要部分和延伸部分。你只需要寫'file = os.path.splitext(os.path.basename(file))[0]' – frogcoder

+0

你知道程序執行前的最大字段嗎?或者你想確定程序中的字段數量? – frogcoder

+0

@frogcoder通過執行hel.append((len(headers))),程序知道文件夾中所有文件的最大字段數。在這種情況下,它是255.使用這個數字,我想在我的csv文件的開始處寫'['file','field1','field2',...'field255']'。當一個帶有300個字段的文件進入我的文件夾時,新的csv文件中應該有最多300個字段。 –

回答

0

您首先需要讀取所有輸入文件以確定最大字段數爲255.然後,您需要構建一個字段名稱列表以寫入輸出文件(只需一次,而不是在一個循環中):

['field{}'.format(i) for i in range(1, 256)] 

您可以傳遞一個列表到csv模塊來寫。

+0

謝謝。根據你的回答,我編輯了我的問題。在我的代碼中,我應該使用csv將該列表寫入csv文件的頂部。 (第一行) –

+0

@김도훈:只需調用'writerow()'一次,而不是在'for file in files:'循環中調用。這將使它寫一次,而不是多次。 –

+0

然後在''open'('test.csv','w',newline ='')中將'writerow()'作爲testfile:'loop?這不是寫在csv文件結尾的行嗎? –

0

讀取每個文件中的字段數和第一行寫入文件前。

import glob 
from itertools import chain 
import os 
from os.path import splitext, basename 

def first_line(filepath): 
    with open(filepath) as f: 
     return next(f) 


def write_test_file(dest_file_path, source_path_name): 
    source_paths = glob.glob(source_path_name) 
    first_lines = list(map(first_line, source_paths)) 

    max_count = max(l.count(",") for l in first_lines) 
    field_names = map("field{}".format, range(1, max_count + 2)) 
    header = ",".join(chain(["file"], field_names)) + os.linesep 

    file_names = (splitext(basename(p))[0] for p in source_paths) 
    content = chain([header], map(",".join, zip(file_names, first_lines))) 

    with open(dest_file_path, 'w') as testfile: 
     testfile.write("".join(content)) 


write_test_file('test.csv', 'C:/dataset/*.csv') 
+0

它的怪異,現在它不寫'[「文件」,「字段1」,「字段2」 ..]'在csv文件的頂部,但是從文件,我認爲這是閱讀其他行,因爲裏面有實際值。 –

+0

@김도훈抱歉,我不明白這個問題。結果標題有問題嗎? – frogcoder

+0

結果標題很好。它成功地寫了'['file','field1',..]'但是在那之下與我從我的代碼中得到的不同。我的代碼從csv文件讀取第一行,這些文件通常是字段名稱,但是當我嘗試了代碼時,其中有實際的值,這意味着它讀取其他行,然後將它們寫入新的csv文件。 –