#python #csv #parsing #text #split
#python #csv #синтаксический анализ #текст #разделить
Вопрос:
У меня есть большой текстовый файл, полный заметок, которые я хотел бы разделить на отдельные строки с помощью Python. Я немного заставил это работать, но это добавляет по одной букве на ячейку в файле .csv, а не во весь раздел. Я вставил @@@
символы, чтобы обозначить, где каждый раздел должен быть разделен. Например, вот как выглядит мой файл .txt:
@@@ jlkdlkjdlkjdalkjdalk @@@ 78278947298729874298742 @@@ llkdlaklkdalkdsa
@@@ nmczxmnczxmncz
В конечном итоге я хочу, чтобы он был экспортирован в .csv, чтобы это выглядело так:
ID | Reporttext
1 | jlkdlkjdlkjdalkjdalk
2 | 78278947298729874298742
3 | llkdlaklkdalkdsa
4 | nmczxmnczxmncz
Прямо сейчас он экспортируется следующим образом: j l k d l k (и так далее).
Вот мой код:
импортируйте повторно, csv с помощью open(«thetext.txt «) как f: для строки в f: для слова в строке.split(«@@@»): с помощью open(r’theoutput.csv’, ‘a’) как g: writer = csv.writer(g) writer.writerow(word) печать (word)
Итак, просто чтобы повторить, моя проблема заключается в том, чтобы избежать интервала (например, t h i s ) при экспорте.
Спасибо!
Комментарии:
1.Если я правильно понимаю, ваш разделитель ‘@@@’, верно? В любом случае вы пытались использовать pandas для загрузки вашего файла, а затем экспортировать его в csv?
data = pd.read_csv('my_file.txt', sep="@@@ ", header=None)
pd.to_csv('my_new_file.csv')
Ответ №1:
Вы могли бы выполнить удаление и разделение на @
подобном,
$ cat txt2csv.py
import csv
with open('some.txt') as file_, open('some_new.csv', 'w') as csvfile:
lines = [x for x in file_.read().strip().split('@') if x]
writer = csv.writer(csvfile, delimiter='|')
writer.writerow(('ID', 'Reporttext'))
for idx, line in enumerate(lines, 1):
writer.writerow((idx, line.strip('@')))
И входной файл,
$ cat some.txt
@@@ jlkdlkjdlkjdalkjdalk @@@ 78278947298729874298742 @ llkdlaklkdalkdsa @@@ nmczxmnczxmncz
И выходной файл,
$ cat some_new.csv
ID|Reporttext
1| jlkdlkjdlkjdalkjdalk
2| 78278947298729874298742
3| llkdlaklkdalkdsa
4| nmczxmnczxmncz
Ответ №2:
Сначала вы должны открыть оба файла одним
with open("thetext.txt") as f, open(r'theoutput.csv', 'a') as g:
import csv
with open("thetext.txt") as f, open('theoutput.csv', 'a') as g:
lines = [x for x in f.read().strip().split('@') if x]
writer = csv.writer(g, delimiter='|')
writer.writerow(('ID', 'Reporttext'))
for lineNumber, line in enumerate(lines, 1):
writer.writerow((lineNumber, line.strip('@')))
Также вы должны использовать
lines = f.readlines()
Потому что то, что происходит сейчас, заключается в том, что python обрабатывает файл txt как большую строку
Комментарии:
1. Использование
for line in f:
вместоf.readlines()
совершенно нормально и даже более экономично для памяти, поскольку оно читает построчно вместо предварительной загрузки каждой строки в объект.2. Это очень полезно, я этого не знал.
Ответ №3:
Аналогично ответу от han solo, вы могли бы выполнить чтение строки и разделение следующим образом:
import csv
with open("thetext.txt") as txt, open('theoutput.csv', 'a') as csvfile:
writer = csv.writer(csvfile, delimiter=';')
writer.writerow(('ID', 'Reporttext'))
id = 1
for line in txt:
words = line.strip().split("@@@")
for word in words:
writer.writerow((id, word.strip()))
id = 1
Таким образом, вы читаете свой текстовый файл построчно, затем разбиваете его на @@@
, прежде чем записывать их слово за словом в свой CSV-файл. Вы даже можете удалить начало @@@
из вашего входного файла.
Комментарии:
1. Код работает, но единственная проблема заключается в том, что текст смещен. Например, «1» отображается под идентификатором, но также отображается и часть текста. Я бы хотел, чтобы они были в отдельных столбцах, чтобы я мог импортировать это в базу данных. Нужно ли мне использовать Pandas или что-то еще для этого? Извините, я не был ясен.
2. Если вам нужен обычный файл CSV, то вы должны использовать точку с запятой в качестве разделителя. Я соответствующим образом отредактирую свой ответ. И вам следует удалить начало
@@@
в вашем файле, чтобы приведенный выше код не записывал пустые ячейки.