【问题标题】:Write to second column of csv file after first column在第一列之后写入 csv 文件的第二列
【发布时间】:2017-06-29 13:49:13
【问题描述】:

我正在将我的代码输出写入 .csv 文件。共有三个目录,每个目录包含 50 个文件。我想将每个目录文件的输出写在不同的列中。喜欢;

       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
.. 

我想在 group1 列下写前 50 个答案,在 group2 中写下 50 个答案,在 group3 中写最后 50 个答案

最终输出看起来像,

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

【问题讨论】:

  • 你真的应该在打开文件时使用with
  • @FamousJameous2可以with解决写入下一栏的问题
  • 无法就地编辑文件,只能将行写入末尾。因此打开文件,将您想要的内容存储为一行,然后将其写入out。更多信息:here
  • with 确保文件在代码执行结束时关闭 - 请参阅here
  • 这是文件打开问题吗?有没有办法在第一列之后写数据?

标签: python python-2.7 csv


【解决方案1】:

这就是我将如何重写您的代码。我所做的更改是:

  • 在打开文件时使用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()

【讨论】:

    【解决方案2】:

    您至少有一个问题是缩进错误。您首先通过以下方式生成所有文件名:

    ...
    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
    

    【讨论】:

      【解决方案3】:
       for filename in files:
        for item in c.items():
         oi=("{}\t{}".format(*item))  
         out_array = oi.split()` 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()
      

      【讨论】:

      • 您好,感谢您的回答。如果你能解释你的代码是做什么的,那就太好了。以这种方式向您学习将有助于社区更多!
      猜你喜欢
      • 2014-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-09
      • 2015-06-21
      • 1970-01-01
      • 2021-10-16
      • 2019-06-10
      相关资源
      最近更新 更多