2
votes

Analyser et diviser le fichier .text et exporter en lignes .csv en utilisant Python

J'ai un gros fichier texte plein de notes que je voudrais diviser et séparer en lignes individuelles en utilisant Python. Je l'ai fait fonctionner un peu, mais il ajoute une lettre par cellule dans un fichier .csv, pas la section entière. J'ai inséré les caractères @@@ pour indiquer où chaque section doit être divisée. Par exemple, voici à quoi ressemble mon fichier .txt:

ID | Reporttext

1  | jlkdlkjdlkjdalkjdalk 
2  | 78278947298729874298742 
3  | llkdlaklkdalkdsa
4  | nmczxmnczxmncz

Je veux finalement l'exporter vers .csv pour qu'il ressemble à ceci:

@@@ jlkdlkjdlkjdalkjdalk @@@ 78278947298729874298742 @@@ llkdlaklkdalkdsa
@@@ nmczxmnczxmncz

Pour le moment, il est exporté comme ceci: jlkdlk (et ainsi de suite).

Voici mon code:

import re, csv avec open ("thetext.txt") comme f: pour la ligne en f: pour mot en ligne.split ("@@@"): avec open (r'theoutput.csv ',' a ') comme g: écrivain = csv.writer (g) writer.writerow (mot) print (word)

Donc, juste pour répéter, mon problème est d'éviter l'espacement (par exemple, t h i s) lors de l'exportation.

Merci !


1 commentaires

Si je comprends que votre séparateur est «@@@», n'est-ce pas? Dans tous les cas, avez-vous essayé d'utiliser des pandas pour charger votre fichier et ensuite l'exporter vers csv? data = pd.read_csv ('mon_fichier.txt', sep = "@@@", header = Aucun) pd.to_csv ('mon_new_file.csv')


3 Réponses :


1
votes

Tout d'abord, vous devez ouvrir les deux fichiers avec un

lines = f.readlines()
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('@')))

Vous devez également utiliser

with open("thetext.txt") as f, open(r'theoutput.csv', 'a') as g:

Parce que ce qui se passe maintenant, c'est que python traite le fichier txt comme une grande chaîne


2 commentaires

Utiliser pour ligne dans f: au lieu de f.readlines () est tout à fait correct et encore plus convivial car il lit ligne par ligne au lieu de charger chaque ligne d'un objet au préalable .


C'est très utile, je ne le savais pas.



3
votes

Vous pouvez faire du décapage et du fractionnement sur le @ comme,

$ cat some_new.csv 
ID|Reporttext
1| jlkdlkjdlkjdalkjdalk 
2| 78278947298729874298742 
3| llkdlaklkdalkdsa 
4| nmczxmnczxmncz

Et le fichier d'entrée,

$ cat some.txt 
@@@ jlkdlkjdlkjdalkjdalk @@@ 78278947298729874298742 @ llkdlaklkdalkdsa @@@ nmczxmnczxmncz

Et le fichier de sortie,

$ 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('@')))


0 commentaires

1
votes

Semblable à la réponse de han solo, vous pouvez faire la lecture et la division de ligne comme ceci:

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

De cette façon, vous lisez votre fichier txt ligne par ligne, puis divisez-le en @@@ avant de les écrire mot par mot dans votre fichier CSV. Vous pouvez même supprimer le premier @@@ dans votre fichier d'entrée.


2 commentaires

Le code fonctionne, mais le seul problème est que le texte est mal aligné. Par exemple, "1" apparaît sous ID, tout comme une partie du texte. Je voudrais qu'ils soient dans des colonnes séparées afin que je puisse l'importer dans une base de données. Dois-je utiliser Pandas ou quelque chose pour le faire? Désolé, je n'ai pas été clair.


Si vous voulez un fichier CSV normal, vous devez utiliser un point-virgule comme délimiteur. Je modifierai ma réponse en conséquence. Et vous devez supprimer le premier @@@ de votre fichier afin que le code ci-dessus n'écrive pas de cellules vides.