Python, Pandas: Schreiben Sie den Inhalt von DataFrame in eine Textdatei

82

Ich habe Pandas DataFrame wie diesen

        X    Y  Z    Value 
0      18   55  1      70   
1      18   55  2      67 
2      18   57  2      75     
3      18   58  1      35  
4      19   54  2      70   

Ich möchte diese Daten in eine Textdatei schreiben, die so aussieht:

18 55 1 70   
18 55 2 67 
18 57 2 75     
18 58 1 35  
19 54 2 70 

Ich habe so etwas versucht

f = open(writePath, 'a')
f.writelines(['\n', str(data['X']), ' ', str(data['Y']), ' ', str(data['Z']), ' ', str(data['Value'])])
f.close()

aber es funktioniert nicht. Wie macht man das?

Sounak
quelle

Antworten:

132

Sie können einfach np.savetxtdas np-Attribut verwenden und darauf zugreifen .values:

np.savetxt(r'c:\data\np.txt', df.values, fmt='%d')

Ausbeuten:

18 55 1 70
18 55 2 67
18 57 2 75
18 58 1 35
19 54 2 70

oder to_csv:

df.to_csv(r'c:\data\pandas.txt', header=None, index=None, sep=' ', mode='a')

Beachten np.savetxtSie, dass Sie ein Dateihandle übergeben müssen, das im Append-Modus erstellt wurde.

EdChum
quelle
32

Sie können mit pandas.DataFrame.to_csv () , und beide Einstellung indexund headerzu False:

In [97]: print df.to_csv(sep=' ', index=False, header=False)
18 55 1 70
18 55 2 67
18 57 2 75
18 58 1 35
19 54 2 70

pandas.DataFrame.to_csv Sie können direkt in eine Datei schreiben. Weitere Informationen finden Sie in den oben verlinkten Dokumenten.

Anzel
quelle
Dies wird in große Schwierigkeiten geraten, wenn es zu einer Flucht kommen muss. Es ist nicht die Lösung für den allgemeinen Pandas-Fall!
Matanster
11

Spät zur Party: Versuchen Sie dies>

base_filename = 'Values.txt'
with open(os.path.join(WorkingFolder, base_filename),'w') as outfile:
    df.to_string(outfile)
#Neatly allocate all columns and rows to a .txt file
Rene Duchamp
quelle
2
Dies ergibt keine durch Tabulatoren getrennte Textdatei, sondern scheint eine durch Leerzeichen getrennte Datei auszugeben. Ich mag die Eleganz dieses Codes. Gibt es eine Möglichkeit, die Registerkarte "Ausgabe" abzugrenzen?
AHegde
9

Der derzeit beste Weg, dies zu tun, ist df.to_string():

with open(writePath, 'a') as f:
    f.write(
        df.to_string(header = False, index = False)
    )

Gibt Folgendes aus

18 55 1 70   
18 55 2 67 
18 57 2 75     
18 58 1 35  
19 54 2 70 

Mit dieser Methode können Sie auch einfach auswählen, welche Spalten mit dem columnsAttribut gedruckt werden sollen, die Spalte beibehalten, Beschriftungen indizieren, wenn Sie dies wünschen, und andere Attribute für den Abstand ect haben.

johnDanger
quelle
1

@AHegde - Um die tabulatorgetrennte Ausgabe zu erhalten, verwenden Sie das Trennzeichen sep = '\ t'.

Für df.to_csv:

df.to_csv(r'c:\data\pandas.txt', header=None, index=None, sep='\t', mode='a')

Für np.savetxt:

np.savetxt(r'c:\data\np.txt', df.values, fmt='%d', delimiter='\t')
Manohar Rana
quelle
1

Möglichkeit, Excel-Daten in tabulatorgetrennter Form in eine Textdatei zu übertragen. Müssen Pandas sowie xlrd verwenden.

import pandas as pd
import xlrd
import os

Path="C:\downloads"
wb = pd.ExcelFile(Path+"\\input.xlsx", engine=None)
sheet2 = pd.read_excel(wb, sheet_name="Sheet1")
Excel_Filter=sheet2[sheet2['Name']=='Test']
Excel_Filter.to_excel("C:\downloads\\output.xlsx", index=None)
wb2=xlrd.open_workbook(Path+"\\output.xlsx")
df=wb2.sheet_by_name("Sheet1")
x=df.nrows
y=df.ncols

for i in range(0,x):
    for j in range(0,y):
        A=str(df.cell_value(i,j))
        f=open(Path+"\\emails.txt", "a")
        f.write(A+"\t")
        f.close()
    f=open(Path+"\\emails.txt", "a")
    f.write("\n")
    f.close()
os.remove(Path+"\\output.xlsx")
print(Excel_Filter)

Wir müssen zuerst die xlsx-Datei mit gefilterten Daten generieren und dann die Informationen in eine Textdatei konvertieren.

Abhängig von den Anforderungen können wir \ n \ t für Schleifen und Datentypen verwenden, die in der Textdatei enthalten sein sollen.

Bharat Bhushan
quelle
0

Ich habe eine leicht modifizierte Version verwendet:

with open(file_name, 'w', encoding = 'utf-8') as f:
    for rec_index, rec in df.iterrows():
        f.write(rec['<field>'] + '\n')

Ich musste den Inhalt eines Datenrahmenfeldes (das begrenzt war) als Textdatei schreiben.

Bhaskaran Mani
quelle