【问题标题】:Txt file to excel conversion in python在python中将txt文件转换为excel
【发布时间】:2017-12-20 03:18:10
【问题描述】:

我正在尝试将文本文件转换为 python 中的 excel 工作表。 txt 文件包含以下指定格式的数据

列名:reg no、邮政编码、loc id、emp id、lastname、first name。每条记录都有一个或多个错误编号。每条记录的列名都列在值的上方。我想创建一个 Excel 表,其中包含每个记录的不同行中列出的 reg no、firstname、lastname 和错误。

我怎样才能把记录放在excel表中?我应该使用正则表达式吗?以及如何在相应记录的不同行中插入错误号?

预期输出:

这里是输入文件的链接: https://github.com/trEaSRE124/Text_Excel_python/blob/master/new.txt

欢迎提供任何代码 sn-ps 或建议。

【问题讨论】:

  • 从文件中获取输入并创建一个数据框。然后关注:datacamp.com/community/tutorials/python-excel-tutorial
  • 嗨@GaneshK 您能否更具体地了解创建数据框?任何代码 sn-p 都会有所帮助。
  • 您可以像这样转换输入:entry1:[{'REG NO': 203}, {'ZIP CODE': 1234}...<so on>]。这基本上是一个列表,其中包含要赋值的列名的字典。然后关注:pbpython.com/pandas-list-dict.html
  • PS: 只需阅读第一行,.split() 获取列名列表,然后.split() 第三行获取值。创建它们的字典。
  • 感谢您@GaneshK 的努力。我一直在尝试做同样的事情,但我的问题是我能够为“reg no”创建字典,但在获取错误编号时遇到了麻烦,因为它们位于不同的行中。

标签: python python-3.x python-2.7


【解决方案1】:

这是一个草稿代码。如果需要任何更改,请告诉我:

# import pandas as pd
from collections import OrderedDict
from datetime import date
import csv

with open('in.txt') as f:
    with open('out.csv', 'wb') as csvfile:
        spamwriter = csv.writer(csvfile, delimiter=',', quoting=csv.QUOTE_MINIMAL)
        #Remove inital clutter
        while("INPUT DATA" not in f.readline()):
            continue 

        header = ["REG NO", "ZIP CODE", "LOC ID", "EMP ID", "LASTNAME", "FIRSTNAME", "ERROR"]; data = list(); errors = list()
        spamwriter.writerow(header)
        print header

        while(True):
            line = f.readline()
            errors = list()
            if("END" in line):
                exit()
            try:
                int(line.split()[0])
                data = line.strip().split()
                f.readline() # get rid of \n
                line = f.readline()
                while("ERROR" in line):
                    errors.append(line.strip())
                    line = f.readline()
                spamwriter.writerow(data + errors)
                spamwriter.flush() 
            except:
                continue


        # while(True):
            # line = f.readline()

使用 python-2 运行。错误将作为后续列附加。你想要的方式有点复杂。如果仍然需要,我可以修复它

输出如下:

【讨论】:

  • 抱歉耽搁了。我有考试
  • 您可以跳过初始部分。我假设数据集将与您上传的一样。
  • 我尝试运行您的程序,但运行程序需要很长时间并且不会将数据写入输出文件。我正在使用 jupyter notebook 在 Python 2 中运行它。
  • 可能是无限循环。好像格式完全一样?在这里和那里添加一些打印语句。否则我会修改它。
  • 哦,我认为这是原因:stackoverflow.com/questions/3976711/…
【解决方案2】:

您可以使用能够将项目直接存入电子表格的 openpyxl 库来执行此操作。此代码显示了如何针对您的特定情况执行此操作。

NEW_PERSON, ERROR_LINE = 1,2
def Line_items():
    with open('katherine.txt') as katherine:
        for line in katherine:
            line = line.strip()
            if not line:
                continue
            items = line.split()
            if items[0].isnumeric():
                yield NEW_PERSON, items
            elif items[:2] == ['ERROR', 'NUM']:
                yield ERROR_LINE, line
            else:
                continue

from openpyxl import Workbook
wb = Workbook()
ws = wb.active

ws['A2'] = 'REG NO'
ws['B2'] = 'LASTNAME'
ws['C2'] = 'FIRSTNAME'
ws['D2'] = 'ERROR'

row = 2
for kind, data in Line_items():
    if kind == NEW_PERSON:
        row += 2
        ws['A{:d}'.format(row)] = int(data[0])
        ws['B{:d}'.format(row)] = data[-2]
        ws['C{:d}'.format(row)] = data[-1]
        first = True
    else:
        if first:
            first = False
        else:
            row += 1
        ws['D{:d}'.format(row)] = data

wb.save(filename='katherine.xlsx')

这是结果的屏幕快照。

【讨论】:

    猜你喜欢
    • 2019-10-28
    • 1970-01-01
    • 1970-01-01
    • 2017-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-20
    • 1970-01-01
    相关资源
    最近更新 更多