通过文本字符串创建表/ csv

时间:2019-02-12 12:10:20

标签: python text processing

重新发布它,因为它被错误地标记为重复。这篇文章是linked,但没有回答我的问题

我是Python的新手,我有一个像这样的文本字符串。我需要将其转换为表格的帮助。我尝试通过创建字典来做到这一点,但是,每行中的列数并不总是相同的,这造成了一个问题。另外,文本中有诸如“股票”之类的列,我在最终输出中不需要

删除空行和其他信息之后。文本文件如下所示。

XYZ
XYZ
ABC
ABC
MNP
MNP
Fruit
Apple
price
30
Number
10
Fruit
kiwi
stock
10
Number
20
Fruit
grape
price
12

这是我希望以表格格式显示的输出,第二行应为价格留空值,第三行应为Number留空值。

Fruit    price    Number    
Apple    30       10    
kiwi              20    
grape    12             

2 个答案:

答案 0 :(得分:1)

您可以使用pandas创建此类表:

import pandas as pd

text = '''XYZ
XYZ
ABC
ABC
MNP
MNP
Fruit
Apple
price
30
Number
10
Fruit
kiwi
Number
20
Fruit
grape
price
12'''

data = {'Fruit': [], 'price': [], 'Number': []}
lines = text.split()
for i in range(len(lines)):
    if i+5 < len(lines) and lines[i] == 'Fruit' and lines[i+2] == 'price' and lines[i+4] == 'Number':
        data['Fruit'].append(lines[i+1])
        data['price'].append(lines[i+3])
        data['Number'].append(lines[i+5])
    elif i+3 < len(lines) and lines[i] == 'Fruit' and lines[i+2] == 'Number':
        data['Fruit'].append(lines[i+1])
        data['price'].append('')
        data['Number'].append(lines[i+3])
    elif i+3 < len(lines) and lines[i] == 'Fruit' and lines[i+2] == 'price':
        data['Fruit'].append(lines[i+1])
        data['price'].append(lines[i+3])
        data['Number'].append('')

df = pd.DataFrame(data)
print(df)

结果:

   Fruit price Number
0  Apple    30     10
1   kiwi           20
2  grape    12       

您还可以将结果保存为CSV:

df.to_csv('result.csv')

答案 1 :(得分:0)

这是我想在第一个版本中使用的解决方案,以防您不想使用熊猫:

#!/usr/bin/env python

import re

data = """
    XYZ
    XYZ
    ABC
    ABC
    MNP
    MNP
    Fruit
    Apple
    price
    30
    Number
    10
    Fruit
    kiwi
    Number
    20
    Fruit
    grape
    price
    12"""

def doit(data):

    table = []

    data = re.split(r'\s+', data)
    currentFruit = None
    while len(data):
        line = data.pop(0)
        if line == "Fruit":
            if currentFruit:
                table.append(currentFruit)
            currentFruit = { 'name': data.pop(0) }
        elif currentFruit:
            currentFruit[line] = data.pop(0)
    table.append(currentFruit)

    print "%-9s%-9s%-9s" % ("Fruit", "price", "Number")
    for fruit in table:
        print "%-9s%-9s%-9s" % (fruit['name'],
                                fruit['price'] if 'price' in fruit else '',
                                fruit['Number'] if 'Number' in fruit else '')

doit(data)