Текстовый файл с 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() 

3 Solutions collect form web for “Текстовый файл с Python”

Я бы использовал цикл 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() – вам нужно будет написать отдельный код, чтобы 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 
  • Вывод текста за пределы фигуры
  • скрытие текстового файла в exe с помощью py2exe / pygame2exe
  • Shell: вставьте пустую / новую строку на две строки над рисунком
  • Python: получение только сообщения сообщения POP3, без заголовков
  • BeautifulSoup возвращает неожиданные дополнительные пробелы
  • Поиск текста в PDF с помощью Python?
  • Автоматически читать текст чата от Minecraft
  • Гибкое скользящее окно (в Python)
  • Python не читает весь текстовый файл
  • Поиск и добавление файла .kml с использованием python
  • Найти и заменить текст в файле .docx - Python
  • Python - лучший язык программирования в мире.