【问题标题】:Python - sort csv data from multiple files based on columnsPython - 根据列对来自多个文件的 csv 数据进行排序
【发布时间】:2018-04-10 11:18:47
【问题描述】:

我有一个包含多个文件的文件夹,每个文件中每个文件的列数都不同。我想浏览目录,打开每个文件并循环遍历每一行,根据该行中的列数将该行写入一个新的 CSV 文件。我想为所有 14 列的行创建一个大 CSV,为所有 18 列的行创建另一个大 CSV,最后一个 CSV 包含所有其他列。

这是我目前所拥有的。

import pandas as pd
import glob
import os
import csv


path = r'C:\Users\Vladimir\Documents\projects\ETLassig\W3SVC2'
all_files = glob.glob(os.path.join(path, "*.log")) 

for file in all_files:
    for line in file:
        if len(line.split()) == 14:
            with open('c14.csv', 'wb') as csvfile:
                csvwriter = csv.writer(csvfile, delimiter=' ')
                csvwriter.writerow([line])
        elif len(line.split()) == 18:
            with open('c14.csv', 'wb') as csvfile:
                csvwriter = csv.writer(csvfile, delimiter=' ')
                csvwriter.writerow([line])          
            #open 18.csv
        else:
            with open('misc.csv', 'wb') as csvfile:
                csvwriter = csv.writer(csvfile, delimiter=' ')
                csvwriter.writerow([line])
print(c14.csv)

任何人都可以就如何解决这个问题提供任何反馈吗?

【问题讨论】:

    标签: python file csv


    【解决方案1】:

    您可以将所有列添加为列表中的列表:

    l = []
    for file in [your_files]:
        with open(file, 'r') as f:
            for line in f.readlines()
                l.appned(line.split(" "))
    

    现在你有了列表列表,所以只需按照子列表的长度对它们进行排序,然后将其放入一个新文件中:

    l.sort(key=len)
    
    with open(outputfile, 'w'):
         # Write  lines here as you want
    

    【讨论】:

    • 非常感谢 - 是否有用于写入输出文件的 writelines() 方法?
    • 是的,你可以做很多事情。 @詹姆斯库珀
    【解决方案2】:

    事先请注意,您可以复制原样从输入文件到输出文件,不需要CSV机制。

    也就是说,我建议使用文件对象字典和字典的get 方法,它允许指定默认值。

    files = {14:open('14.csv', 'wb'),
             18:open('18.csv', 'wb')}
    other = open('other.csv', 'wb')
    
    for file in all_files:
        for line in open(file):
            llen = len(line.split())
            target = files.get(llen, other)
            target.write(line)
    

    如果您必须处理几百万条记录,请注意这一点,因为

    In [20]: a = 'a '*20                                                                      
    
    In [21]: %timeit len(a.split())                                                           
    599 ns ± 1.59 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
    
    In [22]: %timeit a.count(' ')+1                                                           
    328 ns ± 1.28 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
     
    

    您应该将上面的 for 循环替换为

    for file in all_files:
        for line in open(file):
            fields_count = line.count(' ')+1
            target = files.get(fields_count, other)
            target.write(line)
    

    应该因为,即使我们说的是纳秒,文件系统访问也是一样的

    In [23]: f = open('dele000', 'w')                                                         
    
    In [24]: %timeit f.write(a)                                                               
    508 ns ± 154 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
    

    作为拆分/计数。

    【讨论】:

      猜你喜欢
      • 2014-12-02
      • 2015-09-07
      • 1970-01-01
      • 1970-01-01
      • 2016-03-08
      • 2018-09-02
      • 2022-01-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多