Проанализируйте и разделите файл .txt и экспортируйте в строки .csv с помощью Python

#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, то вы должны использовать точку с запятой в качестве разделителя. Я соответствующим образом отредактирую свой ответ. И вам следует удалить начало @@@ в вашем файле, чтобы приведенный выше код не записывал пустые ячейки.