【问题标题】:How to create a csv file from a txt file with column separator after "x" amount of characters如何在“x”个字符后从带有列分隔符的 txt 文件创建 csv 文件
【发布时间】:2021-01-11 19:25:20
【问题描述】:

我有一个如下所示的 txt 文件:

MT0111500000000 Anniston-Oxford-Jacksonville, AL Metropolitan Statistical Area
MT0112220000000 Auburn-Opelika, AL Metropolitan Statistical Area  
MT0113820000000 Birmingham-Hoover, AL Metropolitan Statistical Area

我需要从中创建一个 csv 文件,我对此没有什么经验,但一直在学习和做,虽然可能效率不高。

我现在的问题是,当我使用熊猫时,它会在“,”之后创建列。我需要的是列分隔符位于左侧代码“MT0113820000000”之后,尽管代码确实发生了变化,但它们的长度都相同。

在此先感谢,我知道这是一个非常菜鸟的问题。

这是我目前的代码:

import pandas as pd

dataframe1 = pd.read_csv("C:/Users/andre/Desktop/bea_api_test/python-bureau-economic-analysis-api-client/testttt/output.txt")  
dataframe1.to_csv('output_.csv', index = None)

还有输出:

COLUMN 1                                COLUMN 2
MT0111500000000 Anniston-Oxford-Jacksonville     | AL Metropolitan Statistical Area

【问题讨论】:

  • 你能告诉我们你写的代码吗?样本输出?
  • 是的,完成了。如果您还需要什么,请告诉我。
  • 签出pandas.read_fwf ("fwf" = 固定宽度文件)
  • 你希望 df 是什么? MT 的东西只有 2 列,然后是其他所有内容?
  • 2列,第一列是MT代码,第二列是其余的。

标签: python python-3.x pandas dataframe csv


【解决方案1】:

或者,使用上面评论中提到的read_fwf

from io import StringIO
import pandas as pd

testdata = '''\
MT0111500000000 Anniston-Oxford-Jacksonville, AL Metropolitan Statistical Area
MT0112220000000 Auburn-Opelika, AL Metropolitan Statistical Area
MT0113820000000 Birmingham-Hoover, AL Metropolitan Statistical Area
'''

buff = StringIO(testdata)

df = pd.read_fwf(buff, header=None, colspecs=[(0, 15), (16, 64 * 1024)])

print(df.to_csv(index=False, columns=[0, 1], header=['COLUMN1', 'COLUMN2']))

【讨论】:

  • 是否有运行它并且没有添加逗号和引号?
  • @unisonnn,如果您创建 CSV(逗号-分隔值)文件,将使用逗号分隔列。 (但是,您可以使用 to_csvsep 参数来写入具有不同分隔符的文件)
  • 引号是为了防止数据中的逗号被解释为第二列分隔符。如果您不想要逗号或引号,也许您应该重新考虑是否要将输出文件称为“CSV”并让我们知道您真正想要的格式。
  • 我让它工作了。在从提供的 csv 中创建一个 dict 后,我​​ pprinted 输出。没有嵌套引号。这行得通。
【解决方案2】:

您可以在第一次出现空格时拆分数据:

data = pd.read_table("data.txt", squeeze = True, header = None).str.split(" ", 1)
df = pd.DataFrame(data.tolist(), columns = ["column1", "column2"])

df.to_csv("df.csv")

【讨论】:

    【解决方案3】:

    这不是 CSV,我看不出有一种方便的方法可以说服 read_csv 做正确的事情。幸运的是,这里似乎有一个简单的规则。第一个空格之前的东西,然后是之后的东西。 str.split 就是这样做的。

    import pandas as pd
    from pathlib import Path
    
    #in_file = Path("C:/Users/andre/Desktop/bea_api_test/python-bureau-economic-analysis-api-client/testttt/output.txt")
    in_file = Path("test.txt")
    out_file = in_file.with_name(in_file.stem + "_").with_suffix(".csv")
    
        # test data
        open(in_file, "w").write("""\
        MT0111500000000 Anniston-Oxford-Jacksonville, AL Metropolitan Statistical Area
        MT0112220000000 Auburn-Opelika, AL Metropolitan Statistical Area  
        MT0113820000000 Birmingham-Hoover, AL Metropolitan Statistical Area""")
        
        # convert to csv
        pd.DataFrame([line.strip().split(" ",1) for line in open(in_file)],
            columns=["COLUMN1", "COLUMN2"]).to_csv(out_file, index=None, headr=False)
        
        # visual verification
        print(open(out_file).read())
    

    输出

    MT0111500000000,"Anniston-Oxford-Jacksonville, AL Metropolitan Statistical Area"
    MT0112220000000,"Auburn-Opelika, AL Metropolitan Statistical Area"
    MT0113820000000,"Birmingham-Hoover, AL Metropolitan Statistical Area"
    

    在此示例中,我立即编写了 csv,以便自动从内存中删除数据帧。您也可以使用 CSV 模块执行此操作,一次写入一行。这将使用更少的内存,因为它不必将整个文件保存在内存中。由于csv 是标准python 库的一部分,因此对pandas 没有外部依赖。添加一点文件名处理

    import csv
    from pathlib import Path
    
    #in_file = Path("C:/Users/andre/Desktop/bea_api_test/python-bureau-economic-analysis-api-client/testttt/output.txt")
    in_file = Path("test.txt")
    out_file = in_file.with_name(in_file.stem + "_").with_suffix(".csv")
    
    # test data
    open(in_file, "w").write("""\
    MT0111500000000 Anniston-Oxford-Jacksonville, AL Metropolitan Statistical Area
    MT0112220000000 Auburn-Opelika, AL Metropolitan Statistical Area  
    MT0113820000000 Birmingham-Hoover, AL Metropolitan Statistical Area""")
    
    # convert to csv
    with open(in_file) as infp, open(out_file, "w") as outfp:
        writer = csv.writer(outfp)
        writer.writerows(line.strip().split(" ",1) for line in infp)
    
    # visual verification
    print(open(out_file).read())
    

    【讨论】:

    • 当我运行这段代码时,它仍然像这样拆分它:“MT0112220000000 Auburn-Opelika”,
    • 当我第一次运行时,我得到了MT0112220000000,"Auburn-Opelika, AL Metropolitan Statistical Area"。请注意,第二列被引用,因此其内部逗号不被视为 CSV 逗号。
    • 我收到一个错误:NameError: name 'p' is not defined
    • 理想情况下引号将被删除,也许我正在这样做,但我正在尝试从中创建一个字典,因此不想要嵌套引号。
    • 哦,如果你想要一个字典,那就另当别论了。引号必须在那里,否则地名中的逗号会变成一个新的逗号。作为输入处理的一部分,CSV 阅读器会删除这些引号。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-18
    • 1970-01-01
    • 2016-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多