Python, Pandas: escriba el contenido de DataFrame en un archivo de texto

82

Tengo pandas DataFrame como este

        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   

Quiero escribir estos datos en un archivo de texto que se ve así:

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

He intentado algo como

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

pero no funciona. ¿Como hacer esto?

Sounak
fuente

Respuestas:

132

Puede usar np.savetxty acceder al atributo np .values:

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

rinde:

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

o bien to_csv:

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

Tenga en cuenta np.savetxtque tendría que pasar un identificador de archivo que se haya creado con el modo de adición.

EdChum
fuente
32

Puede usar pandas.DataFrame.to_csv () y configurar ambos indexy headerpara 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 puede escribir en un archivo directamente, para obtener más información, puede consultar los documentos vinculados anteriormente.

Anzel
fuente
esto generará muchos problemas cuando sea necesario escapar, ¡no es la solución para el caso general de Pandas!
matanster
12

Tarde para la fiesta: prueba esto>

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
René Duchamp
fuente
2
Esto no da un archivo de texto delimitado por tabulaciones, parece generar un archivo delimitado por espacios. Me gusta la elegancia de este código, ¿hay alguna forma de delimitar la pestaña de salida?
AHegde
9

La mejor manera actual de hacer esto es usar df.to_string():

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

Producirá lo siguiente

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

Este método también le permite elegir fácilmente qué columnas imprimir con el columnsatributo, le permite mantener la columna, las etiquetas de índice si lo desea, y tiene otros atributos para el espaciado, etc.

john Peligro
fuente
1

@AHegde: para obtener la salida delimitada por tabulaciones, use el separador sep = '\ t'.

Para df.to_csv:

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

Para np.savetxt:

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

Manera de obtener datos de Excel en un archivo de texto en forma delimitada por tabulaciones. Necesita usar Pandas y xlrd.

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)

Primero debemos generar el archivo xlsx con datos filtrados y luego convertir la información en un archivo de texto.

Dependiendo de los requisitos, podemos usar \ n \ t para bucles y el tipo de datos que queremos en el archivo de texto.

Bharat Bhushan
fuente
0

Usé una versión ligeramente modificada:

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

Tuve que escribir el contenido de un campo de marco de datos (que estaba delimitado) como un archivo de texto.

Bhaskaran Mani
fuente