【问题标题】:How to read multiple csv in python and get one csv as output如何在python中读取多个csv并获得一个csv作为输出
【发布时间】:2017-05-02 01:48:26
【问题描述】:

我已经问过如何在熊猫中解决这个问题。但现在我需要一个非 pandas 版本。

我的代码

import glob
import os

## path
path = r'C:/x/x/Desktop/xxx/'
all_files = glob.glob(os.path.join(path, '*.csv'))

## column
column_headers = ['Date', 'Time', 'Duration', 'IP', 'Request']

## open only one csv. -- I want to read here not only 1 file --
## my approach:
## with open(all_files) as log, ....
with open('log.csv') as log, open('out355.csv', 'w') as out:
    out.write(';'.join(column_headers)+'\n') 
    while True:
        try:
            lines = [next(log).strip('\n').split(' ',4) for i in range(6)][3:]
            out.write(';'.join(lines[1][:2]+[l[4] for l in lines])+'\n')
        except StopIteration:
            break

因为我是 python 新手,所以我不能仅仅修改我正在运行的代码。所以如果我能得到完整的代码,我会很高兴的。

谢谢!

【问题讨论】:

  • “如果我能得到完整的代码,我会很高兴” - SO 不是代码编写服务,我们不是来帮你做作业的.
  • 你最好使用csv 模块!!
  • 感谢您的反对,我写道我是python的新手。这不是我的作业..祝你有美好的一天:)
  • 拜托,像计算机一样思考,我们需要输入,我们会为您提供输出,因此,请发布您的 csv 数据,说明您想要输出的内容,并指出您遇到问题的部分。
  • 不管你是“新手”,不管它是设置为作业还是你的需求来自其他地方,这不是写代码服务.

标签: python csv dataset


【解决方案1】:

你已经接近了,你需要阅读每个*.csv 文件并将它们连接起来。因此,您必须打开一个新文件并使用 glob 读取每个 csv 文件。确保执行此操作时,每个 csv 文件的末尾都有一个尾随新行,否则您最终会在同一行上看到最后一行 file_x 和第一行数据行 file_x+1

from glob import glob

with open('combined.csv', 'a') as combinedFile:
    combinedFile.write('a,b,c,d,e\n') # Headers
    for eachFile in glob('*.csv'):
        if eachFile == 'combined.csv':
            pass
        else:
            count = 0
            for line in open(eachFile, 'r'):
                if count != 0: # So that you don't read 1st line of every file if it contains the headers.
                    combinedFile.write(line)
                count = 1

运行时:

a.csv

a,b,c,d,e
1,2,3,4,5
6,7,8,9,10

b.csv

a,b,c,d,e
11,12,13,14,15
16,17,18,19,20

combined.csv

a,b,c,d,e    
1,2,3,4,5
6,7,8,9,10
11,12,13,14,15
16,17,18,19,20

【讨论】:

  • 嗨,Sudheesh。感谢您的解决方案!我想在我的代码中添加一个正则表达式。我应该把它放在哪里?我只想将字符串写入 csv,我与我的正则表达式匹配:[\0-9]+[ s] 谢谢!
【解决方案2】:

按照这些思路应该可以工作:

with open('out355.csv', 'w') as out:
  for csvfile in all_files:
    with open(csvfile) as log:
      out.write(...)
      .. the rest of your script ..

【讨论】:

    【解决方案3】:

    这应该工作

    import glob
    import os
    
    ## path
    path = r'C:/x/x/Desktop/xxx/'
    all_files = glob.glob(os.path.join(path, '*.csv'))
    
    ## column
    column_headers = ['Date', 'Time', 'Duration', 'IP', 'Request']
    
    out = open('out355.csv', 'w')
    out.write(';'.join(column_headers)+'\n')
    for file_ in all_files:
        log = open(file_)
        while True:
            try:
                lines = [next(log).strip('\n').split(' ',4) for i in range(6)][3:]
                out.write(';'.join(lines[1][:2]+[l[4] for l in lines])+'\n')
            except StopIteration:
                break
    

    【讨论】:

    • 感谢您的解决方案!代码生成一个新的输出 csv,列名已写入,但文件为空..那会是什么?
    • try 块中的脚本存在一些问题。你能告诉我它是否适用于单个文件
    猜你喜欢
    • 2017-04-24
    • 1970-01-01
    • 2017-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-25
    • 2021-07-07
    • 2021-01-23
    相关资源
    最近更新 更多