2017-06-29 314 views
0

我正在將我的代碼的輸出寫入.csv文件。有三個目錄,每個目錄包含50個文件。我想將每個目錄文件的輸出寫入不同的列。喜歡;在第一列之後寫入csv文件的第二列

 group1 group2 group3 
file1 1445  89 87 
file2 1225  100 47 
file3 650  120 67 
file4 230  140 97 

我有下面的代碼這樣做,

from collections import Counter 
import glob 
import os 

out= open('output.csv','a') 
out.write (';''group-1') 
out.write (';''group-2') 
out.write (';''group-3') 
out.write('\n') 
i = 1 

while i<=50: 
out.write("file-%d" %i) 
out.write('\n') 
i+=1 
i=1 
path = 'group/group-*-files/*.txt' 

files=sorted(glob.glob(path)) 
c=Counter() 

for filename in files: 

for line in open(filename,'r'): 

    c.update(line.split()) 

for item in c.items(): 
    oi=("{}\t{}".format(*item)) 
    out_array = oi.split() 

    if out_array[0]=='00000000': 

    out.write(out_array[1]) 
    out.write('\n') 
    c.clear() 

我越來越並沒有能夠解決的問題,答案開始後,文件編號寫在第一列50

file48 
file49 
file50 
1445 
1225 
.. 

我想寫第一組50列,第二組50列,第三組最後50列

最終輸出的樣子,

group1 group2 group3 
file1 145  89  87 
file2 850  100 47 
file3 650  120 67 
file4 230  140 97 
+0

你真的應該使用['with'(https://stackoverflow.com/q/9282967/3901060)當您打開文件。 – FamousJameous

+0

@ FamousJameous2可以用''來解決寫入下一列的問題 – hassan

+0

不可能在原地編輯文件,只能在最後寫行。因此打開文件,將你想要的內容存儲爲一行,並將其寫入'out'。更多信息:[這裏](https://stackoverflow.com/questions/5453267/is-it-possible-to-modify-lines-in-a-file-in-place) –

回答

0

這是我怎麼會重寫代碼。我所做的更改:

  • 打開文件時,使用with語句,以確保他們得到關閉
  • 使用csv模塊,使編寫csv文件更容易
  • 寫一次通過建立整條生產線在將其寫入文件之前,一次一行。

因爲我不知道你的文件是什麼,所以沒有經過徹底的測試。

import csv 
from collections import Counter 
import glob 
import os 

with open('output.csv','a') as out: 
    writer =csv.writer(out, delimiter='\t') 
    writer.writerow(['']+['group{}'.format(i) for i in range(1, 4)]) 
    path = 'group/group-*-files/*.txt' 

    files=sorted(glob.glob(path)) 
    c=Counter() 
    for i, filename in enumerate(files): 
     line = ['file-{}'.format(i)] 
     with open(filename) as infile: 
      for line in infile: 
       c.update(line.split()) 
     for key, count in c.items(): 
      if key == '00000000': 
       line.append(count) 
     writer.writerow(line) 
     c.clear() 
0

您至少有一個問題與錯誤壓痕。您首先通過以下方式生成所有文件名:

... 
while i<=50: 
out.write("file-%d" %i) 
out.write('\n')    # replace \n to column delimiter \t 
i+=1 

然後開始處理文件。你刪除這一行i=1和所有其他文本必須有相同的縮進開始爲out.write

from collections import Counter 
import glob 
import os 

out= open('output.csv','a') # flag a - Do you want append to existing file ? 
out.write('file;group-1;group2;group3') # You forget column 1 - filename 
# out.write (';''group-1') 
# out.write (';''group-2') 
# out.write (';''group-3') 
# out.write('\n') 
i = 1 
while i<=50: 
out.write("file-%d" %i) 
# out.write('\n') 
out.write(';') # Insert character for column delimiter 
i+=1 
# i=1 Delete, because will cause infinite loop 
# Following code must run inside while loop, indent to the same level 
# as previous lines 
path = 'group/group-*-files/*.txt' 

files=sorted(glob.glob(path)) 
c=Counter() 

for filename in files: 

    for line in open(filename,'r'): 

    c.update(line.split()) 

    for item in c.items(): 
    oi=("{}\t{}".format(*item)) 
    out_array = oi.split() 

    if out_array[0]=='00000000': 

    out.write(out_array[1]) 
    # out.write('\n') - You don want create new lines, but only new columns for every group 
    out.write(';') 

    c.clear() 
    out.write('\n') # New line - new record 
相關問題