Текстовый файл парсинга с помощью Python

Я пытаюсь разобрать ряд текстовых файлов и сохранить их как CSV-файлы с помощью Python (2.7.3). Все текстовые файлы имеют заголовок длиной 4 строки, который необходимо удалить. Строки данных имеют различные разделители, включая " (цитата), - (тире),: столбец и пустое пространство. Мне было больно кодировать его на C++ со всеми этими разными разделителями, поэтому я решил попробовать его в Python, слыша, что это относительно легче сделать по сравнению с C/C++.

Я написал кусок кода, чтобы проверить его на одна строка данных, и она работает, однако мне не удалось заставить ее работать для фактического файла. Для разбора одной строки я использовал текстовый объект и метод" replace". Похоже, моя текущая реализация читает текстовый файл как список, и для объекта list нет метода replace.

будучи новичком в Python, я застрял в этом месте. Любой вклад будет оценен!

спасибо!

# function for parsing the data
def data_parser(text, dic):
for i, j in dic.iteritems():
    text = text.replace(i,j)
return text

# open input/output files

inputfile = open('test.dat')
outputfile = open('test.csv', 'w')

my_text = inputfile.readlines()[4:] #reads to whole text file, skipping first 4 lines


# sample text string, just for demonstration to let you know how the data looks like
# my_text = '"2012-06-23 03:09:13.23",4323584,-1.911224,-0.4657288,-0.1166382,-0.24823,0.256485,"NAN",-0.3489428,-0.130449,-0.2440527,-0.2942413,0.04944348,0.4337797,-1.105218,-1.201882,-0.5962594,-0.586636'

# dictionary definition 0-, 1- etc. are there to parse the date block delimited with dashes, and make sure the negative numbers are not effected
reps = {'"NAN"':'NAN', '"':'', '0-':'0,','1-':'1,','2-':'2,','3-':'3,','4-':'4,','5-':'5,','6-':'6,','7-':'7,','8-':'8,','9-':'9,', ' ':',', ':':',' }

txt = data_parser(my_text, reps)
outputfile.writelines(txt)

inputfile.close()
outputfile.close()

3 ответов


Я бы использовал for цикл для итерации по строкам в текстовом файле:

for line in my_text:
    outputfile.writelines(data_parser(line, reps))

Если вы хотите прочитать файл по строкам, а не загружать все это в начале скрипта, вы можете сделать что-то вроде этого:

inputfile = open('test.dat')
outputfile = open('test.csv', 'w')

# sample text string, just for demonstration to let you know how the data looks like
# my_text = '"2012-06-23 03:09:13.23",4323584,-1.911224,-0.4657288,-0.1166382,-0.24823,0.256485,"NAN",-0.3489428,-0.130449,-0.2440527,-0.2942413,0.04944348,0.4337797,-1.105218,-1.201882,-0.5962594,-0.586636'

# dictionary definition 0-, 1- etc. are there to parse the date block delimited with dashes, and make sure the negative numbers are not effected
reps = {'"NAN"':'NAN', '"':'', '0-':'0,','1-':'1,','2-':'2,','3-':'3,','4-':'4,','5-':'5,','6-':'6,','7-':'7,','8-':'8,','9-':'9,', ' ':',', ':':',' }

for i in range(4): inputfile.next() # skip first four lines
for line in inputfile:
    outputfile.writelines(data_parser(line, reps))

inputfile.close()
outputfile.close()

из принятого ответа, похоже, ваше желаемое поведение-повернуть

skip 0
skip 1
skip 2
skip 3
"2012-06-23 03:09:13.23",4323584,-1.911224,-0.4657288,-0.1166382,-0.24823,0.256485,"NAN",-0.3489428,-0.130449,-0.2440527,-0.2942413,0.04944348,0.4337797,-1.105218,-1.201882,-0.5962594,-0.586636

на

2012,06,23,03,09,13.23,4323584,-1.911224,-0.4657288,-0.1166382,-0.24823,0.256485,NAN,-0.3489428,-0.130449,-0.2440527,-0.2942413,0.04944348,0.4337797,-1.105218,-1.201882,-0.5962594,-0.586636

если это так, то я думаю что-то вроде

import csv

with open("test.dat", "rb") as infile, open("test.csv", "wb") as outfile:
    reader = csv.reader(infile)
    writer = csv.writer(outfile, quoting=False)
    for i, line in enumerate(reader):
        if i < 4: continue
        date = line[0].split()
        day = date[0].split('-')
        time = date[1].split(':')
        newline = day + time + line[1:]
        writer.writerow(newline)

было бы немного проще, чем reps вещи.


есть несколько способов сделать это. Одним из вариантов было бы использовать inputfile.read() вместо inputfile.readlines() - вам нужно написать отдельный код, чтобы очистить первые четыре строки, но если вы хотите, чтобы конечный результат был одной строкой, это может иметь наибольший смысл.

второй, более простой вариант-присоединиться к строкам после чередования первых четырех строк с my_text = ''.join(my_text). Это немного неэффективно, но если скорость не важна, то код будет простейший.

наконец, если вы действительно хотите получить вывод в виде списка строк вместо одной строки, вы можете просто изменить свой анализатор данных для итерации по списку. Это может выглядеть примерно так:

def data_parser(lines, dic):
    for i, j in dic.iteritems():
        for (k, line) in enumerate(lines):
            lines[k] = line.replace(i, j)
    return lines