避免由于 space 字符作为分隔符 + Python 文本文件中的文本而导致的解析错误

Avoiding parsing errors due to space character as delimiter + text in Python text files

如果一个文本文件包含一个字符,比如 space,作为分隔符和文本的一部分,我们应该如何使用 pandas read_csv, read_table 或文件读取?

您可以使用这些数组键来动态收集元素,因此前 6 个元素将如您所愿地被捕获(请注意,line 变量应该在某个循环中迭代文件中的每一行, 将行分配给名为 'line'):

的变量
 elements = line.split(" ")
 int_fields = elements[:6]
 last_field = elements[6:]

最后一个字段将是您的最后一个整数,如果它是一个整数的话。如果它是一个字符串,就像您在示例中发布的名称一样,last_field 将是一个数组。然后,您可以通过将它们视为一个字符串(当您拆分该字符串时,其他整数将是字符串)将它们连接到一个变量中:

field = ""
for item in last_field:
    field += "{} ".format(item)
field.strip()

这会将所有单词添加到一个字符串中,包括 spaces。 strip 函数在末尾删除多余的 spaces。

同样,使用 space 分隔文件通常不是一个好方法,如果您有权访问创建文件的任何内容,请将分隔符更改为逗号或竖线 (|)

此代码可能会向您展示基本思想。

  • 我用了你的样本行加一行没有地方数据。
  • 逐行读取数据,以白色拆分space。
  • 如果仅存在数字数据,则将其放入临时存储区,在此代码中,StringIO。如果还有字符串数据,则先适当格式化。
  • 'Rewind'临时存储,用pandas读取。

import pandas as pd
from io import StringIO

for_pd = StringIO()
with open('zafar.txt') as zafar:
    for line in zafar:
        line = line.strip()
        items = line.split()
        if len(items) == 6:
            print(','.join(items), file=for_pd)
        elif len(items) == 9:
            print(','.join(items[:6])+',"{} ({}), {}"'.format(items[7],items[6],items[8]), file=for_pd)

for_pd.seek(0)

df = pd.read_csv(for_pd, header=None, names=['1','2','3','4','5','6','place'])
print(df)

输出:

      1     2     3    4        5        6                           place
0  5440  1988  2018  439  49.0116  10.9308                             NaN
1  5440  1988  2018  439  49.0116  10.9308  Emetzheim (Weißenburg), Bayern