【问题标题】:Problem with concatenation of 2 files in python在python中连接2个文件的问题
【发布时间】:2019-07-24 12:39:22
【问题描述】:

我想在一个文件中附加两个 ASCII 文件(例如,F1_Jan_01.txtF1_jan_01.txt 分别包含在目录 d01d02 中)。事实上,我有两个目录,其中我有每个类别的文件(F1F2F3),月份和日期(1 到 7),我想附加具有相同名称的文件位于两个不同的目录。所以,我用 Python 编写了以下代码。

import pandas as pd

maindir1="/home/d01/"
maindir2="/home/d02/"
outdir="/home/final/"

pol=[ "F1","F2","F3" ]

month=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]

for iis,ipol in enumerate(pol):
    for jjs,imonth in enumerate(month):
        for kk in range(1,7,1):
            df1 = pd.read_csv(maindir1+str(ipol)+"_"+str(imonth)+"_0"+str(kk)+".txt", sep="\t")
            df2 = pd.read_csv(maindir2+str(ipol)+"_"+str(imonth)+"_0"+str(kk)+".txt", sep="\t")
            df = pd.concat([ df1, df2 ], ignore_index=True)
            df.to_csv(outdir+str(ipol)+"_"+str(imonth)+"_0"+str(kk)+".txt",sep="\t",index=False)

问题是在最终输出中,当它追加第二个文件时,它没有写入第一行。例如,第一个文件(d01)有 100000 行,第二个文件(d02)有 50000 行。因此,在最终输出中正确写入前 100000 行,然后附加第二个文件的 49000 行文件不包括其第一行。

我是否必须在代码中定义其他任何内容?

【问题讨论】:

  • 如果实际上你所做的只是连接文件,那么你不需要 Pandas 来做这件事!
  • 尝试调用 pd.read_csv(..... , header=None)
  • 为什么不将这两个文件经典地读取为 2 个字符串,然后将 read_str1 + read_str2 输出到输出文件中?
  • @LaurensKoppenol 我尝试添加 header=None 并正确写入文件,但它还在输出中添加了一行作为标题。
  • 那么当您调用df.to_csv 时,您还包括header=False

标签: python file concatenation


【解决方案1】:

不使用 Pandas,下面是等效代码。 (干编码,YMMV。)

maindir1 = "/home/d01/"
maindir2 = "/home/d02/"
outdir = "/home/final/"

pols = ["F1", "F2", "F3"]
months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]

for ipol in pols:
    for imonth in months:
        for kk in range(1, 7):
            template_args = {"ipol": ipol, "imonth": imonth, "kk": kk}
            filename = "{ipol}_{imonth}_0{kk}.txt".format(ipol=ipol, imonth=imonth, kk=kk)
            out_name = os.path.join(outdir, filename)
            in_names = [os.path.join(maindir1, filename), os.path.join(maindir2, filename)]
            with open(out_name, "w") as out_file:
                for in_name in in_names:
                    with open(in_name, "r") as in_file:
                        out_file.write(in_file.read())

【讨论】:

  • 我喜欢你如何修复糟糕的内联字符串 concat。但是你的模板参数是怎么回事?还;从 python 3.7 开始,您可以在没有 .format() 的情况下执行 filename = f"{ipol}_{imonth}_0{kk}.txt",这真的很酷。
  • 大多数人还没有 Python 3.7,我不想将他们与不起作用的功能混淆。
猜你喜欢
  • 1970-01-01
  • 2015-02-07
  • 2010-11-12
  • 1970-01-01
  • 2021-05-31
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多