导入具有不均匀列号和复杂分隔符的文本文件

时间:2017-03-29 19:17:19

标签: python regex pandas

说我有如下文字文件:

apple  pear  banana,  peach orange grape

dog  cat  white horse

salmon

tiger  lion  eagle hawk  monkey

寻找输出:

"apple", "pear", "banana", "peach orange grape"

"dog", "cat", "white horse"

"salmon"

"tiger", "lion", "eagle hawk", "monkey"

两个问题,

  1. 每一行我只想用双倍空格分隔它们' '
  2. 每行的列号可以是随机的,从1到100
  3. 如何将它们加载到pandas数据框中?

    事实上,我想知道是否可以在不逐行阅读的情况下完成此操作,因为我的初步解决方案是:

    1. 读取每一行,使用REX

      re.split(r' \ s {2,}',line)

    2. 以双倍空格分割

      1. 拆分双倍空格后,将每行插入DF
      2. 但是,由于列号是随机的,我不能简单地生成DF。 在pd.read_csv()中添加names = []将处理不均匀的列,但这需要预先定义列名和数字。

        有什么建议吗?

        谢谢!

2 个答案:

答案 0 :(得分:2)

read_table()是你的朋友......

df = pd.read_table('./test.txt', sep="  ", header=None)
df.to_csv('outfile.csv')

任何缺失的列都将填充NaN。

上面的文本文件test.txt如下:

test  2  1
t
t2  1
t3
t4  3  4

和df看起来像这样:

      0    1    2
0  test  2.0  1.0
1     t  NaN  NaN
2    t2  1.0  NaN
3    t3  NaN  NaN
4    t4  3.0  4.0

要在输出中获取引用,您可能需要使用csv中的quoting选项:

import csv
import pandas as pd

df = pd.read_table('./test.txt', sep="  ", header=None)
df.to_csv(quoting=csv.QUOTE_NONNUMERIC)

答案 1 :(得分:1)

除了提供@JD Long提供的另一个示例之外,您还可以使用正则表达式和列表理解:

import re, pandas as pd

string = """
apple  pear  banana  peach orange grape

dog  cat  white horse

salmon

tiger  lion  eagle hawk  monkey
"""

rx = re.compile(r'''[ ]{2,}''')

items = [(rx.split(line)) for line in string.split("\n") if line]

df = pd.DataFrame.from_records(items)
print(df)

......产生:

        0     1            2                   3
0   apple  pear       banana  peach orange grape
1     dog   cat  white horse                None
2  salmon  None         None                None
3   tiger  lion   eagle hawk              monkey