在Jupyter Notebook/Python中使用Pandas将两个.csv文件合并为一个

fkvaft9z  于 2023-04-27  发布在  Python
关注(0)|答案(1)|浏览(441)

我有两个独立的.csv文件,看起来完全不同,即`.csv1=作者姓名,csv创建日期,基本上关于数据的详细信息,和.csv2=实际数据。
它们都是从Jupyter外部生成的,虽然我可以轻松地手动完成,但我感兴趣的是,是否有一种方法可以将它们组合成一个csv,在顶部有csv1,然后在下面有csv2的数据,以保存时间。
我试过合并和追加,但它们似乎与dataframes而不是csv一起工作,因为两个csv如此不同,我认为这是另一种方法,但我不确定它是什么,因为它代表了我唯一的代码是在两个csv文件中阅读。

p4tfgftt

p4tfgftt1#

如果你只想合并两个文件file1.csvfile2.csv,那么标准库模块shutil中的copyfileobj为大文件提供了一个有效的方法(带分块):

from shutil import copyfileobj

with open("combined.csv", "w") as fout:
    for file in "file1.csv", "file2.csv":
        with open(file, "r") as fin:
            copyfileobj(fin, fout)

如果文件不是很大,你也可以这样做:

with open("combined.csv", "w") as fout:
    for file in "file1.csv", "file2.csv":
        with open(file, "r") as fin:
            fout.write(fin.read())

如果从1.到2.文件的转换由于1.文件的最后一行内容的末尾缺少换行符而变得混乱,您可以将代码的最后一行替换为:

...
            fout.write(fin.read().rstrip("\n") + "\n")

现在,如果文件太大 * 并且 * 转换变得混乱,您可以执行以下操作:

from fileinput import input as finput

with open("combined.csv", "w") as fout,\
     finput(["file1.csv", "file2.csv"]) as fin:
         line = next(fin)
         fout.write(line)
         for next_line in fin:
            if fin.isfirstline() and not line.endswith("\n"):
                next_line = "\n" + next_line
            fout.write(next_line)
            line = next_line

标准库模块fileinput中的input函数提供了一种方便的方法来遍历文件序列的所有行,并对当前位置在序列中的位置进行一些控制检查。
或者你可以使用标准库中的csv模块:

import csv

with open("combined.csv", "w") as fout:
    writer = csv.writer(fout)
    for file in "file1.csv", "file2.csv":
        with open(file, "r") as fin:
            writer.writerows(csv.reader(fin))

相关问题