Je voudrais transformer un tuple Python en un fichier .csv. Disons que j'ai une fonction retrive () et quand je l'imprime avec pprint cela ressemble à ceci:

test = tuple(retrive(directory))
pprint(test, width=1)

Alors:

("opinion_1.txt, I am an amateur photographer and own three DSLR c.... purchase",
 "opinion_2.txt, This my second Sony Digital Came.... good camera for a good price!',
 'opinion_3.txt, \'I ordered this camera with high hopes after  couldn\\\'t find.\'')

J'ai donc essayé ceci avec le module csv:

with open('/Users/user/Downloads/output.csv','w') as out:
    csv_out=csv.writer(out)
    csv_out.writerow(['id','content'])
    for row in test:
        csv_out.writerow(row)

Le problème est que j'obtiens une sortie bizarre qui ressemble à ceci:

id,content
o,p,i,n,i,o,n,_,1,.,t,x,t,",", ,I, ,a,m, ,a,n, ,a,m,a,t,e,u,r, ,p,h,o,t,o,g,r,a,p,h,e,r, ,a,n,d, ,o,w,n, ,t,h,r,e,e, ,D,S,L,R, ,c,a,m,e,r,a,s, ,w,i,t,h, ,a, ,s,e,l,e,c,t,i,o,n, ,o,f, ,l,e,n,s,e,s,., ,H,o,w,e,v,e,r, ,t,h,a,t, ,c,o,l,l,e,c,t,i,o,n, 

Comment puis-je obtenir quelque chose comme ça:

opinion_1.txt,I am an amateur photographer and own three DSLR c.... purchase
opinion_2.txt,This my second Sony Digital Came.... good camera for a good price!
opinion_3.txt,I ordered this camera with high hopes after  couldn\\\'t find.
2
tumbleweed 7 mars 2016 à 08:59

3 réponses

Meilleure réponse

CSV essayant d'itérer sur la chaîne que vous passez du tuple. Changez votre code pour:

for row in test:
    csv_out.writerow(row.split(', ', 1))

Cela signifie que vous divisez chaque chaîne du tuple par première occurrence de ', '. Il produit deux éléments pour chaque ligne et c'est ce dont l'écrivain csv a besoin.

3
Andrey Rusanov 7 mars 2016 à 06:06

Votre analyse est détruite si l'une de vos phrases comporte plusieurs virgules comme celle-ci:

s = "opinion_4.txt, Oh my, what happens with really, really long sentences?"

>>> s.split(", ")
['opinion_4.txt',
 'Oh my',
 'what happens with really',
 'really long sentences?']

Une meilleure approche serait de trouver la première virgule, puis de diviser la phrase en utilisant le découpage à cet emplacement:

for line in text:
    comma_idx = line.find(', ')
    csvout.writerow(line[:comma_idx], line[comma_idx+2:])

Pour la phrase ci-dessus, il en résulterait:

('opinion_4.txt', 'Oh my, what happens with really, really long sentences?')
1
Alexander 7 mars 2016 à 06:32

Si vous avez besoin d'une solution Pandas, utilisez DataFrame constructor et to_csv:

import pandas as pd

df = pd.DataFrame([ x.split(',') for x in test ])
df.columns = ["id","content"]
print df
#              id                                            content
#0  opinion_1.txt   I am an amateur photographer and own three DS...
#1  opinion_2.txt   This my second Sony Digital Came.... good cam...
#2  opinion_3.txt   'I ordered this camera with high hopes after ...

#for testing
#print df.to_csv(index=False)
df.to_csv("/Users/user/Downloads/output.csv", index=False)
#id,content
#opinion_1.txt, I am an amateur photographer and own three DSLR c.... purchase
#opinion_2.txt, This my second Sony Digital Came.... good camera for a good price!
#opinion_3.txt, 'I ordered this camera with hig

S'il y a plusieurs ,, vous pouvez utiliser split par première occurrence de ,:

import pandas as pd

test = ("opinion_1.txt,a","opinion_2.txt,b","opinion_3.txt,c",  "opinion_3.txt,b,c,k")
print test

print [ x.split(',', 1) for x in test ]
[['opinion_1.txt', 'a'], 
 ['opinion_2.txt', 'b'], 
 ['opinion_3.txt', 'c'], 
 ['opinion_3.txt', 'b,c,k']]

df = pd.DataFrame([ x.split(',', 1) for x in test ])
df.columns = ["id","content"]
print df
              id content
0  opinion_1.txt       a
1  opinion_2.txt       b
2  opinion_3.txt       c
3  opinion_3.txt   b,c,k

print df.to_csv(index=False)
id,content
opinion_1.txt,a
opinion_2.txt,b
opinion_3.txt,c
opinion_3.txt,"b,c,k"
1
jezrael 7 mars 2016 à 07:19