python3.5csv特殊字符解析

2024-06-12 16:30:21 发布

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

我有一个文件,我想把它解析成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文件,如下所示:

^{pr2}$

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

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(描述符单词、冒号、方括号等),而且在一个大数据集上花费了很长时间。同时,我把它全部保存到一个辅助文件中,而不是就地写入。通过用逗号代替冒号,我的时间被分解成单独的列。我花了几天时间研究了不同的选项,并使用了regex,但是作为一个完全的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)

编辑:sparkandshine下面的解决方案非常适合设置行,但我发现我的一些数据有不同长度的行。例如,有时几行会短几列数据,或者最后三列可能重复两次。为了解决这个问题,我一直在使用“try”和“except error,continue”作为可能的长度。用这个方法,我在最后的文件中得到了重复的行;有没有更好的方法来使用Sparkandshine的解来处理不同长度的行呢。。。或者,只需查找重复行(通过检查/比较两个/三个列)并删除它们是否更容易?在


Tags: 文件csv数据importidforlinecode
2条回答

使用以下方法处理每条线

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]
            ]

print(new_list)
# Output
['03:30:30', '08:30:30', '15 August 2015', '987654321', '12', '1234', '12', '1234', '123', '12']

写入csv文件时使用

^{pr2}$

或者处理所有行并将结果保存到列表列表中,然后使用writerows将结果wirte保存到csv文件中

writer.writerows(lists)

完整的源代码

#!/usr/bin/env python
import csv

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

with open(outputFileName, 'w') as outfile:
    w = csv.writer(outfile)

    # write the file header
    fieldnames = ['local time', 'GMT time', 'date', 'product id', 'manuf id', 
            'case', 'pallet', 'id', 'code', 'company id', 'location', 'secondary code']
    writer.writerow(fieldnames)


    # process each line
    with open(inputFileName, 'r') as inFile:
        for line in inFile:
            str_list = line.rstrip().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]]

            w.writerow(new_list) # write to the file

如果输入文件的结构已知,则不需要使用正则表达式,因为正则表达式速度较慢。对于您的情况,请尝试使用类似于以下代码的代码:

import csv
with open('destination.csv', 'w', newline='') as csvfile:
    csv_writer = csv.writer(csvfile, delimiter=',')
    ...  # get your data here, the next code is for one line of data
    values = line.split()
    values[2] = '{} {} {}'.format(values[2][1:], values[3], values[4][:-1])  # Get rid of square brackets
    for idx in range(5, 11):
        values[idx] = values[idx].split(':')[1]  # get the number values
    values.pop(3);  # remove separated month name
    values.pop(3);  # remove separated year

    csv_writer.writerow(values)

您只编辑需要它的数据,然后将整行写入csv。在

相关问题 更多 >