【问题标题】:Convert text file containing multiple delimiters to CSV将包含多个分隔符的文本文件转换为 CSV
【发布时间】:2021-01-04 17:38:55
【问题描述】:

一个文本文件看起来像这样。我想将其转换为 CSV 文件。

Water level.txt

当我使用 Pandas 时:

df = pd.read_fwf(f)

看起来像:

似乎有制表符和空格用于分隔符,我将行改为:

df = pd.read_csv('Water level.txt' ,  sep = '[" "|\t]', encoding='GBK', engine = 'python')

但它警告:

pandas.errors.ParserError: Expected 14 fields in line 4, saw 16. Error could possibly be due to quotes being ignored when a multi-char delimiter is used.

使用 Python 将其转换为 CSV 文件的正确方法是什么?

【问题讨论】:

  • 请注意,[" "|\t] 包含管道的匹配项 - 您在字符类中,它并不意味着“或”。您还匹配一个 single 空格,因此您可能有一些包含空字符串的字段。在处理“参差不齐”的数据方面,请参阅stackoverflow.com/q/46127026/3001761
  • 这些带引号的字段中是否有空格,例如"North East",或者更糟糕的是,带空格的未引用字段?正则表达式解析器会将"North East" 视为两列("North", "East")
  • @jonrsharpe,感谢您的评论。也就是说,告诉 read_csv 列数。 :)
  • @tdelaney,感谢您的评论。幸好没有,只有“东”和“西”。
  • Pandas 需要猜测有多少列。在您的示例中,文件以 4 列开始并移动到 5。但是当第 5 列出现时,pandas 已经决定只有 4。由于没有定义所有列的标题行,您可以添加一个names=["foo", "bar", "baz", etc...](使用 14 个更具描述性的名称)到 read_csv。如果您只需要整数列名,您甚至可以使用 names=range(14)

标签: python pandas csv delimiter


【解决方案1】:

您的正则表达式需要调整,`r"[ \t]+" 选择任意长度的空格和制表符(1 或更大)。此外,pandas 使用文件的第一行来确定有多少列。您的示例从 4 列开始,然后再添加另一列。太晚了——pandas 已经创建了 4 个元素行。您可以通过提供自己的列名来解决这个问题,让 pandas 知道实际有多少。在这个例子中,我只使用了整数,但你可以给它们起更有用的名字。

df = pd.read_csv('Water level.txt' ,  sep=r'[ \t]', encoding='GBK',
   engine='python', names=range(5))

【讨论】:

    【解决方案2】:

    如果数据结构没有改变,请尝试传入列宽。 https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_fwf.html 这里还有其他选项read_fwf

    验证宽度参数是否正确:

    pd.read_fwf('JcP65rQY5F2Y.txt', widths=[5,10,9,2,5])
    
    
        Unnamed: 0  Unnamed: 1  Unnamed: 2  Unnamed: 3 Unnamed: 4
    0        09:25        7.54         288          17        NaN
    1        09:30        7.55          20           6        NaN
    2        09:30        7.55           7           2       East
    3        09:30        7.55          11           3       East
    4        09:30        7.56           5           4       West
    ..         ...         ...         ...         ...        ...
    194      09:59        7.60           3           1       East
    195      09:59        7.60           9           4       East
    196      09:59        7.60           8           1       West
    197      09:59        7.60          51           3       West
    198      09:59        7.59          20          15       East
    
    [199 rows x 5 columns]
    

    【讨论】:

    • 感谢您的帮助!但是列宽可能会有所不同...
    猜你喜欢
    • 1970-01-01
    • 2012-09-18
    • 1970-01-01
    • 2018-11-20
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 2017-12-09
    相关资源
    最近更新 更多