Текстовый файл с Python

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

Я написал фрагмент кода, чтобы проверить его на одну строку данных, и он работает, однако мне не удалось заставить его работать для фактического файла. Для разбора одной строки я использовал текстовый объект и метод "replace". Похоже, что моя текущая реализация читает текстовый файл в виде списка, и нет метода 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()

Ответ 1

Я бы использовал цикл 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()

Ответ 2

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

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.

Ответ 3

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

Второй, более простой вариант my_text = ''.join(my_text) бы в воссоединении строк после чередования первых четырех строк с помощью 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