wrting to Excel file with excelwriter give no file - python

I have 9 sub directories which have three files and I want to write those files to an Excel file. I start by reading all sub directories and then I convert the file to list then to dataframe which I export to an Excel file using "to_excel" and "writer excel" but for a strange reasons, the code does not produces any file.
# Path to the different files
path = r"C:\Users\Emmanuelle\Documents\tal\retrotraduction\corpus_amazon\corpus_retraduit"
for root, subdirs, files in os.walk(path):
#print(root)
for file in files:
print(file)
f_name = file[:-7]
print(f_name)
#print(files)
print("-----File in processed :", file)
with open(os.path.join(root, file), "r", encoding='utf-8') as b_translate_file:
liste = [line.rstrip() for line in b_translate_file]
if liste[0] != 'Contenu':
#print(liste)
if len(liste) == 2020:
print("-------------")
print("-----File of freins category identified :" , len(liste))
print("-------------")
df = pd.DataFrame(liste)
print(df)
writer = pd.ExcelWriter(os.path.join(path, "/{}.xlsx".format(f_name)), engine ='xlsxwriter')
df.to_excel(writer, sheet_name = f_name)
I expected file with 2020 elements to be write to the excel file.
df looks like this
----File of freins category identified : 2020
-------------
0
0 Malheureusement, l'impression de violence, bie...
1 Tout cela ne me donne pas envie d'utiliser un ...
2 """Mettre 5 étoiles dans le pétrin pour cet al...
3 "c'est bien écrit, c'est fluide, la seule pris...
4 Oui, bien sûr, il y a la super introduction de...
... ...
2015 m'a plongé dans une nuit blanche pour ce roman...
2016 Ce disque n'est pas mauvais en soi, mais il ne...
2017 "En voulant changer l'esprit de la série, les ...
2018 "Voici le déclin et la décadence d'une ancienn...
2019 "C'est l'ensemble le plus complet, à ma connai...

Try simplifying this:
os.path.join(path, "/{}.xlsx".format(f_name)) into "{}.xlsx".format(f_name)
Also, how about trying:
df.to_excel(path_name, sheet_name=f_name) instead, without the use of ExcelWriter?

Related

Append list of lists to dataframe display list errors

Good afternoon,
I am looking for a way to append a list of lists into a dataframe as column but I am not getting the result I expected. I have a directory with 12 files and for each file , I want to put it in a dataframe with the correct header but so far what I am doing, put all the lists, I get to the same column and I cannot change that.
The files are txt files and have mutliple rows. the small one has 200 lines and the long one has approx. 2020 lines.
path=r"C:\Use\Emmanu\Documents\tal\class\corpus"
files = os.listdir(path)
list_all = []
for file in files:
if file.endswith(".txt"):
if os.path.isfile(os.path.join(path,file)):
f=open(os.path.join(path,file),'r', encoding= 'utf-8')
#next(f)
f = [line.rstrip() for line in f]
list_all.append(f)
print(len(list_all))
print(len(list_all[7]))
df = pd.DataFrame()
df = pd.DataFrame(list_all).T.set_index(0).T
print(df.head(5))
df.columns = ['FR_IX', 'FR_IX_A', 'FR_IX_B', 'FR_OR', 'FR_A', 'FR_B',
'MOT_IX' 'MOT_IX_A', 'MOT_IX_B', 'MOT_OR', 'MOT_A', 'MOT_B']
Result is like this and I cannot put each list in a column with the respective header.
12
431
0 ce qui me dérange, c’est le tout connecté, avec les ondes \
1 Ce qui me dérange, c'est que tout est lié, ave...
2 Ce qui me dérange, c'est que tout est lié, ave...
3 Hélas, l'impression de violence, bien que très...
4 Hélas, l'impression de violence, bien que très...
5 Hélas, l'impression de violence, bien que très...
0 Toujours en partant du fait que… donc, qu’il y a cette intelligence et puis on va pouvoir éliminer une partie de ce qui est régul. Maintenant, si ce n’est pas le cas… euh… je n’arriverais pas… Chez nous, je ne vois pas l’intérêt du produit. \
1 Toujours à partir du fait que... donc, qu'il y...
2 Toujours à partir du fait que... donc, qu'il y...
3 Tout ça ne me donne pas envie d'utiliser un pi...
4 Tout cela ne me donne pas envie d'utiliser un ...
5 Tout cela ne me donne pas envie d'utiliser un ...

How to count the number of line in a tsv file which end with a specific string?

I have a tsv file with two columns seperate by tabulation. The first column is the colum of sentences and the second the column of label I want to count the number of sentences which are positive, negative or neutral in the file sa I read it and loop inside it. I come up with this small code but It does not work ? How can I improve it ?
tsv = ['jdmfreins', 'jdmconditions', 'jdmne', 'jdmmotivations']
for s in tsv:
c_pos = 0
c_neu = 0
c_neg = 0
path = os.path.join(fileDir, '/mnt/c/Users/Emmanuelle/Documents/Extraction_corpus/fichier_sorti_tsv', s + '.tsv')
with open(path, 'r', encoding='utf-8') as l_1:
next(l_1)
print(s, '\n ')
l_1 = [line.rstrip() for line in l_1]
for line in l_1:
print(line)
if line.strip().endswith('positif'):
c_pos =+ 1
elif line.strip().endswith('neutre'):
c_neu =+ 1
else:
c_neg =+ 1
print('nombre positif :', c_pos)
print('nombre négatif :', c_neg)
print('nombre neutre :', c_neu, '\n')
The file look like this :
"""""""J'avais adoré les deux premières, mais celui-ci n'est pas du tout à la hauteur.""" positif
Peter Criss et Ace Frehley trouvent davantage leur place dans le travail de composition et au chant (Hooligan / Shock Me) face à l'omniprésence de la paire Stanley/Simmons mais les tensions internes existent et conduiront aux 4 albums solos de 1978... positif
Le contexte est certes bien rendu, mais les rapports entre les héros sont exécrables. positif
Le sujet aurait pu faire un bon vaudeville avec un tant soit peu d'humour et de finesse, mais, la plus belle femme du monde ne peut donner que ce qu'elle a !!! positif
arnold est mauvais, il fait des blagues pas marrantes le mechant est simplement le meme que dans le 2 mais en plus balezes, nick stahl est mauvais : pour finir c'est pitoyable de voir ce que peut faire hollywood pour du fric! neutre
Oui mais... Excusez moi mais même si les sketch me font rire séparément, essayer de tous les avaler en une soirée, c'est comme essayer de manger des kilos de foie gras en un repas. neutre
Au risque de ne pas brosser la majorité dans le sens du poil, je vais donner un avis honnête, qui n'engage que moi mais qui est tellement différent de ceux que j'avais pu lire qu'il peut être utile à certains. positif
(oubliez les compils recentes qui n'ont de compils que le nom,mais n'ont pas oublié au passage le coté biseness négatif
Début long avant d'etre pris par un peu de suspens devant un personnage que l'on pense interessant ( psychothérapeute tueur !)mais elle nous amène vers d'autres personnages s'étendant sur leur séjour, leur rencontre que l'on s'imagine utile pour la fin mais il n'en est rien!! neutre
La charge est un peu cruelle, mais l’unicité du style des DA de Miyasaki finit par me lasser. positif
Bon et bien le premier n'était déjas pas une révélation du cinéma mais là on frise le délit d'abut de confience. positif
Peut être suis-je excessif dans mes propos, mais je crois qu'ils sont à la mesure de ma déception. positif
"""presque cristalline chante pour 2 minutes de Bonheur auditif après tant de déception: Pourquoi ne se lancerait elle pas plutôt dans l'opéra et le répertoire classique revisité???ses nouvelles fréquentations lui font probablement du bien au cœur mais feraient mieux de changer de métier et arrêter de pervertir son talent si mal exploité""""""" neutre
and the answer :
nombre positif : 0
nombre négatif : 0
nombre neutre : 1
I tried also : if line.split('\t') == 'positif': but same answer
You can use Counter from the collections module:
from collections import Counter
with open('file.txt','r') as f:
lines = f.read().splitlines()
count = Counter([l.split()[-1] for l in lines])
print(count)
Output:
Counter({'positif': 8, 'neutre': 4, 'négatif': 1})
If you want the results in a dictionary:
print(dict(count))
Output:
{'positif': 8, 'neutre': 4, 'négatif': 1}
Breaking it down. This part:
with open('file.txt','r') as f:
lines = f.read().splitlines()
will assign all the lines in file.txt to a list called lines. The newlines have already been taken care of by the read().splitlines(). This part:
[l.split()[-1] for l in lines]
is a list comprehension that will list all the last words from the lines in lines, where str.split() will return a list of strings that have been separated by a space, and [-1] means the last element of the list.

Frequency of words in a text (pandas)

I have a column of words and would like to count the frequency of each word in a text and save that result in another column.
Data:
word frequency
0 l’iss
1 station
2 américaines
3 capsule
4 dernier
5 solaires
6 fusées
7 privé
Text:
états-unis : lancement réussi pour station space x dragon états-unis : lancement réussi pour space x dragon la fusée falcon 9, développée par une société privée : spacex, a décollé de la station sans problème ce matin à 7h44 utc. 22 mai 2012. - prévu initialement pour samedi dernier, le lancement a été reporté à la dernière seconde, suite à la défaillance d'une valve dans un des neuf moteurs du pre\xadmier étage du lan\xadceur. le lanceur a décollé du site de lancement du pas de tir 40 (slc-40) de la base de cape canaveral en floride, qui était autrefois utilisé pour les fusée titan iii et iv et qui a été reconverti pour ce lanceur.
I tried:
from collections import Counter
freq = df['word'].str.apply(Counter(text))
My output:
AttributeError: 'StringMethods' object has no attribute 'apply'
Good output:
word frequency
0 cape 1
1 station 2
2 américaines 0
3 capsule 0
4 dernier 1
5 solaires 0
6 fusée 2
You can transform the text into a counter and then fetch the results from it, using a mix of value_counts and to_dict.
# Assuming the text split is on \s
text_counts = pd.Series(text.split(' ')).value_counts().to_dict()
df['Frequency'] = df.word.apply(lambda x: text_counts.get(x, 0)) # In case the word doesn't exist
word Frequency
0 l’iss 0
1 station 2
2 américaines 0
3 capsule 0
4 dernier 0
5 solaires 0
6 fusées 0
7 privé 0
Another approach is using Python's native Counter:
from collections import Counter
text_counter = Counter(text.split())
df['Frequency'] = df.word.apply(lambda x: text_counter.get(x, 0))
It would be easier the other way around. Start with the Counter object and from that build the dataframe
from collections import Counter
text = '''états-unis : lancement réussi pour station space x dragon états-unis : lancement réussi pour space x dragon la fusée falcon 9, développée par une société privée : spacex, a décollé de la station sans problème ce matin à 7h44 utc. 22 mai 2012. - prévu initialement pour samedi dernier, le lancement a été reporté à la dernière seconde, suite à la défaillance d'une valve dans un des neuf moteurs du pre\xadmier étage du lan\xadceur. le lanceur a décollé du site de lancement du pas de tir 40 (slc-40) de la base de cape canaveral en floride, qui était autrefois utilisé pour les fusée titan iii et iv et qui a été reconverti pour ce lanceur.'''
# naive splitting, it might be better to use regex with \b
c = Counter(text.split())
df = pd.DataFrame(list(c.items()), columns=['word', 'count'])
print(df.head())
Outputs
word count
0 états-unis 2
1 : 3
2 lancement 4
3 réussi 2
4 pour 5
You can then filter the dataframe for the words you want (or you can do the filtering while building the dataframe).
Replace your commas with space, then .split() and then use a dictionary comprehension and map that to your df.
import pandas as pd
text = "états-unis : lancement réussi pour station space x dragon états-unis : lancement réussi pour space x dragon la fusée falcon 9, développée par une société privée : spacex, a décollé de la station sans problème ce matin à 7h44 utc. 22 mai 2012. - prévu initialement pour samedi dernier, le lancement a été reporté à la dernière seconde, suite à la défaillance d'une valve dans un des neuf moteurs du pre\xadmier étage du lan\xadceur. le lanceur a décollé du site de lancement du pas de tir 40 (slc-40) de la base de cape canaveral en floride, qui était autrefois utilisé pour les fusée titan iii et iv et qui a été reconverti pour ce lanceur."
df = pd.DataFrame({'word': ["l’iss", 'station', "américaines", "capsule", "dernier", "solaires", "fusée", "privé"]})
text_list = text.replace(',', ' ').split()
word_counts = {i: text_list.count(i) for i in text_list}
df['frequency'] = df['word'].map(word_counts).fillna(0)
You could summarise the word counts in a dict then use map:
text_list = text.split()
word_counts = {word: text_list.count(word) for word in text_list}
df['frequency'] = df['word'].map(word_counts).fillna(0)

Python: Split CSV with character count

Need help in importing CSV file into python.
My CSV file
0,Donc, 2 jours, je me suis rendu compte que Musikfest est le lendemain de voir dmb, quel problème. Signifie que je ne peux pas aller ...
0,Le son est définitivement gâché.Noooooo mon bb
0,Il est le mien! Haha il me suit: ') m'aime et me veut.haha.i wana vivre en Amérique annie
I want to split the above file into 2 columns
Coloumn1 ---- Coloumn2
0 ---- Donc, 2 jours, je me suis rendu compte que Musikfest est le
lendemain de voir dmb, quel problème. Signifie que je ne peux pas
aller ...
0 ---- Le son est définitivement gâché.Noooooo mon bb
0 ---- Il est le mien! Haha il me suit: ') m'aime et me veut.haha.i wana
vivre en Amérique annie
Since my text has commas embedded and my value for the text is always the first character. Is it possible to read my CSV file with splitting first character and rest of the text?
You can use string.split() and specify a max split of 1. By this I mean, if you just want to split the line on the first comma, then do not read the file as a CSV. Instead read it line by line and split the line using string.split(',', 1)
You should use csv library to work with csv files: https://docs.python.org/3/library/csv.html#csv.reader
import csv
result = []
with open('test.csv') as csvfile:
csvreader = csv.reader(csvfile)
for row in csvreader:
result.append((row[0], ''.join(row[1:])))
print(result)

How to correctly parse a tiled map in a text file?

I'm making a RPG with Python and pygame for a school project. In order to create the few maps, I have chosen the Tile Mapping techniques I have seen in some tutorials, using a *.txt file.
However, I have to cut some sprites (trees, houses, ...) into several pieces. The problem is that I'm running out of characters to represent them all!
I also remember that it's possible to take several characters as one (ex : take "100" as one an not as one "1" and two "0"s) and/or to put spaces between characters in the file (e.g. "170 0 2 5 12 48" which is read as six sprites).
But I really don't know how to adapt my program to do this way. I'm pretty sure that I need to modify the way the file is read, but how?
Here's the reading function :
class Niveau:
def __init__(self, fichier):
self.fichier = fichier
self.structure = 0
def generer(self):
"""Méthode permettant de générer le niveau en fonction du fichier.
On crée une liste générale, contenant une liste par ligne à afficher"""
#On ouvre le fichier
with open(self.fichier, "r") as fichier:
structure_niveau = []
#On parcourt les lignes du fichier
for ligne in fichier:
ligne_niveau = []
#On parcourt les sprites (lettres) contenus dans le fichier
for sprite in ligne:
#On ignore les "\n" de fin de ligne
if sprite != '\n':
#On ajoute le sprite à la liste de la ligne
ligne_niveau.append(sprite)
#On ajoute la ligne à la liste du niveau
structure_niveau.append(ligne_niveau)
#On sauvegarde cette structure
self.structure = structure_niveau
def afficher(self, fenetre):
"""Méthode permettant d'afficher le niveau en fonction
de la liste de structure renvoyée par generer()"""
#Chargement des images (seule celle d'arrivée contient de la transparence)
Rocher = pygame.image.load(image_Rocher).convert()
Buisson = pygame.image.load(image_Buisson).convert()
#On parcourt la liste du niveau
num_ligne = 0
for ligne in self.structure:
#On parcourt les listes de lignes
num_case = 0
for sprite in ligne:
#On calcule la position réelle en pixels
x = (num_case+0.5) * taille_sprite
y = (num_ligne+1) * taille_sprite
if sprite == 'R': #R = Rocher
fenetre.blit(Rocher, (x,y))
if sprite == 'B':
fenetre.blit(Buisson,(x,y))
num_case += 1
num_ligne += 1
I think what you want is str.split():
for ligne in fichier:
ligne_niveau = []
#On parcourt les sprites (lettres) contenus dans le fichier
for sprite in ligne.split(): # note split here
ligne_niveau.append(sprite) # no need to check for line end
#On ajoute la ligne à la liste du niveau
structure_niveau.append(ligne_niveau)
split without any arguments will join all consecutive whitespace (including tabs '\t' and newlines '\n') into a single split. For example:
"\ta 13 b \t22 6e\n".split() == ['a', '13', 'b', '22', '6e']
Note that the "sprites" don't have to be the same length, so there's no need for fill characters like extra 0s or *s. You can also simplify using a list comprehension:
def generer(self):
with open(self.fichier) as fichier:
self.structure = [ligne.split() for ligne in fichier]
Alternatively, consider using a comma-separated value format - Python has a whole module (csv) for that:
a,13,b,22,6e

Categories

Resources