【问题标题】:I opened many csv files as one and now I need to add names of this files into我打开了许多 csv 文件,现在我需要将这些文件的名称添加到
【发布时间】:2021-06-09 13:01:40
【问题描述】:

我在文件夹中有很多 csv 文件,它们的名称有 XCV123.csv XCF456.csv、DFT456.csv 等。我打开它们并保存为一个,但我发现其中没有这些文件的名称.csv。 DF 如下所示(当然一个 csv 有很多行):

A B C 
1 2 3 
5 2 3
6 5 2

所以我要找的是像这样的 DF 或 CSV

A B C Name
1 2 3 XCV123
5 2 3 XCF456
6 5 2 DFT456

我用代码打开了这个:

import pandas as pd
from glob import glob

with open('/opt/home/main.csv', 'a') as singleFile:
    for csv in glob('*.csv'):
        if csv == 'main.csv':
            pass
        else:
            for line in open(csv, 'r'):
                singleFile.write(line)

但我必须在这段代码中添加一些内容,但我不知道是什么...感谢您的所有帮助!

最好的问候

【问题讨论】:

    标签: python pandas csv for-loop glob


    【解决方案1】:

    我在这里假设:

    • 所有 csv 文件都有相同的标题
    • 所有 csv 文件都有相同的分隔符:逗号
    • 您可以在 csv 文件中使用带引号的字段
    • 您可以在每次运行时擦除文件

    然后,您可以将代码更改为:

    # use mode wb to control end of lines and overwrite the output file
    with open('/opt/home/main.csv', 'wb') as singleFile:
        do_header = True                 # add 1! header
        for csv in glob('*.csv'):
            if csv == 'main.csv':
                pass
            else:
                with open(csv, 'rb') as file:
                    line = next(file)
                    if do_header:         # only on first pass
                        singlefile.write(line.rstrip() + b',Name\r\n')
                        do_header = False
                    for line in file:
                        singlefile.write(line.rstrip() + ',"{}"\r\n'.format(csv).encode())
                singleFile.write(line)
    

    【讨论】:

    • 感谢您的想法,但我在第 14 行“do_header == False”中收到“SyntaxError: invalid syntax”
    • @Tmiskiewicz:我的错误是我忘记了 2 个结束括号。固定。
    • “singleFile”还有一个小错误。在下一行有“单一文件”。但这没什么。更大的问题是它在一个文件之后停止迭代,代码如下: in 7 else: 8 with open(csv, 'rb') as file: ----> 9 line = next(file) 10 if do_header: # 仅在第一遍 11 singleFile.write(line.rstrip() + b',Name\r\n')
    【解决方案2】:

    使用pandaspathlib

    您可以在 pathlib 对象上使用 .stem 以返回不带扩展名的文件名。

    import pandas as pd
    from pathlib import Path
    
    files = Path('/to/csv/files').glob('*.csv') #rglob if you have sub directories.
    
    dfs = pd.concat([pd.read_csv(file).assign(Name=file.stem) for file in files])
    
    dfs.to_csv('singleFile.csv',index=False)
    

    【讨论】:

    • 感谢您的帮助,但出现错误:“AttributeError: 'str' object has no attribute 'glob'”
    • @Tmiskiewicz 我的错,忘记添加模块导入 - 再试一次
    • 我修复了它,但我得到另一个错误:ValueError: No objects to concatenate...
    • @Tmiskiewicz 您是否将路径传递到您的 csv 文件夹?
    • 我做了,我看到 dfs=pd.concat([pd.read_csv(file) 中缺少字母“s”,但没有帮助
    猜你喜欢
    • 2014-03-29
    • 1970-01-01
    • 1970-01-01
    • 2021-03-28
    • 1970-01-01
    • 2017-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多