Текстовый файл с 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 
  • Найти и заменить текст в файле .docx - Python
  • Редактирование книг с расширенным текстом в openpyxl
  • не может выполнить сокращение с помощью гибкого типа plt.hist
  • как извлечь форматированный текстовый контент из PDF
  • Как добавить текст в прямоугольник pygame
  • преобразование текстового файла в html-файл с помощью python
  • Поиск текста в PDF с помощью Python?
  • Печатать в кодированный файл UTF-8, с перестраиваемыми на платформе символами новой строки?
  •  
    Interesting Posts for Van-Lav

    Boost.Python Hello World на Mac OS X

    Как дублировать строки в пандах на основе элементов в списке

    Как определить, начинается ли строка с числа?

    Какая хорошая двухсторонняя библиотека шифрования реализована в Python?

    Поиск и замена нескольких строк в xml / текстовых файлах с помощью python

    Каков самый pythonic способ проверить, является ли объект числом?

    zen of Python против заявления – философское размышление

    Абсолютный импорт не работает, но относительный импорт

    Использование opencv / Numpy для поиска белых пикселей в цветном изображении с использованием python

    Рекомендуемый модуль публикации / подписки / отправки Python?

    Почему эта команда работает с os.system (), но не подпроцессом.Popen ()?

    IPython-представление классов

    Какие методы реализуют интерфейс буфера в Python?

    Найдите точки за строкой, используя Python

    «Стандартный» способ создания файла конфигурации, подходящего для Python и Java вместе

    Python - лучший язык программирования в мире.