从文本字符串创建表/csv

2024-05-19 01:37:53 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我是Python新手,我有一个类似这样的文本字符串。我需要帮助把它转换成桌子。我试着通过创建字典来做到这一点,但是,每行中的列数并不总是相同的,这就产生了一个问题。此外,文本中还有类似“stock”的列,我在最终输出中不需要这些列

删除空行和其他信息后。文本文件如下所示。你知道吗

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

这是我想要的表格格式的输出,第二行应该有一个空值作为price,第三行应该有一个空值作为Number。你知道吗

Fruit    price    Number    
Apple    30       10    
kiwi              20    
grape    12             

Tags: 标记文本numberapple错误stockprice空值
2条回答

您可以使用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')

这是我的解决方案,我想把这个问题的第一个版本,如果你不想使用熊猫:

#!/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)

相关问题 更多 >

    热门问题