【问题标题】:Python 3.5 csv parsing with special characters带有特殊字符的 Python 3.5 csv 解析
【发布时间】:2023-04-01 15:16:01
【问题描述】:

我有一个文件,我想将其解析为 csv。该文件是一个导出文件,并以以下格式(逐行,每个文件包含数千行)到达我这里:

03:30:30  08:30:30 [15 August 2015] productid:123456789 manuf:987654321 case:12 pallet:1234 id:12 code:1234  12345  123  12

我想将数据存入一个 csv 文件,如下所示:

local time, GMT time, date, product id, manuf id, case, pallet, id, code, company id, location, secondary code
03:30:30, 08:30:30, 15 August 2015, 123456789, 987654321, 12, 1234, 12, 1234, 12345, 123, 12

我已经成功地做到了,但我认为使用了错误的工具。我一直在使用如下行:

import fileinput
for line in fileinput.FileInput("file",inplace=1):
    line = line.replace(":",",")

import fileinput
for line in fileinput.FileInput("file",inplace=1):
    line = line.replace("case"," ")

这给了我类似的东西..

l h, l min, ls, gmt h, gmt m, gmt s, date, product id, manuf id, case, pallet, id, code, company id, location, secondary code
03,30,30,08,30,30,15 August 2015, 123456789, 987654321, 12, 1234, 12, 1234, 12345, 123, 12

问题是:我必须使用连续的行将每个字符和单词解析为 csv(描述符词、冒号、括号等),并且在大型数据集上需要很长时间。此外,我将其全部保存到辅助文件中,而不是原地写入。通过用逗号替换冒号,我的时间被分解成单独的列。我花了几天时间玩不同的选项并到达了正则表达式,但作为一个完整的 python 新手还没有想出一个解决方案。将时间从逗号分隔的块重建为正确的格式可能更简单,但我不知所措。请协助。提前致谢。

编辑:

我已尝试实施 Sparkeandshine 以及 Julian 的可行解决方案版本。我最接近让 Sparkeandshie 的版本工作,但我只能迭代一行;实际在解决方案中的那个,而不是整个文件。我花了最后 24 次尝试两种解决方案的不同迭代,但无济于事。这是我的位置:

#!/usr/bin/env python

import csv
import os

inputFileName = 'test.txt'
outputFileName = 'finished.csv'

with open(inputFileName, newline='') as inFile, open(outputFileName,    'w', newline='') as outfile:
    r = csv.reader(inFile)
    w = csv.writer(outfile)

    line = '03:30:30 08:30:30 [15 August 2015] productid:123456789 manuf:987654321 case:12 pallet:1234 id:12 code:1234 12345 123 12'
str_list = line.split()

new_list = [str_list[0],
        str_list[1],
        ' '.join([item.strip('[]') for item in str_list[2:5]]), # '[15', 'August', '2015]'
        str_list[6].split(':')[1],
        str_list[7].split(':')[1],
        str_list[8].split(':')[1],
        str_list[9].split(':')[1],
        str_list[10].split(':')[1],
        str_list[12],
        str_list[13]
        ]

with open(inputFileName, newline='') as inFile, open(outputFileName, 'w', newline='') as outfile:
    r = csv.reader(inFile)
    w = csv.writer(outfile)

    for row in r:
        w.writerow(new_list)

编辑:以下解决方案的 Sparkandshines 非常适合设置行,但我发现我的一些数据具有不同长度的行。例如,有时几行会缩短几“列”数据,或者最后三列可能重复两次。为了解决这个问题,我一直在使用“尝试”和“除了错误,继续”可能的长度。使用这种方法,我在最终文件中得到重复的行;有没有更好的方法来使用 Sparkandshine 的解决方案来处理不同长度的线? ...或者更容易找到重复的行(通过检查/比较两/三列)并删除它们?

【问题讨论】:

  • “文件是导出文件”是什么意思?
  • iulian,该文件是从专有软件中导出的,我无法更改它提供给我的方式。我需要能够规范化数据,以便我的办公室可以使用它。 eugecm,我尝试了 csv 模块,但没有成功。
  • 你不希望你的 csv 用“,”分隔,只需使用“,”。
  • @james,您的输入文件不在 csv 中。为什么使用csv.reader

标签:
python
parsing
csv
character