Текстовый файл парсинга с помощью 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