2013-05-10 15 views
8

Tôi thấy rằng Pandas có read_fwf, nhưng nó có cái gì đó giống như DataFrame.to_fwf? Tôi đang tìm kiếm sự hỗ trợ cho chiều rộng trường, độ chính xác số và xâu chuỗi. Có vẻ như DataFrame.to_csv không làm điều này. numpy.savetxt, nhưng tôi không muốn làm:Python Pandas, viết DataFrame vào tệp có chiều rộng cố định (to_fwf?)

numpy.savetxt('myfile.txt', mydataframe.to_records(), fmt='some format') 

Điều đó dường như sai. Ý tưởng của bạn được nhiều người đánh giá cao.

+2

hãy xem phương pháp 'to_string' để xem bạn có thể làm những gì bạn muốn không. – zach

+0

Điều này có vẻ gần. Có vẻ như tôi sẽ phải cung cấp cho một chức năng định dạng cho mỗi cột nếu có hai cột nổi hoặc chuỗi có định dạng khác nhau. Nó sẽ làm các trick, nó chỉ có vẻ hơi khó sử dụng. Tôi hy vọng tôi đã thiếu một cái gì đó. Cảm ơn! – jkmacc

+1

gấu trúc * df.to_csv * có tham số * sep = "" * thay đổi dấu phẩy thành bất kỳ thứ gì khác trong trường hợp này là dấu cách hoặc chuỗi trống. Điều đó kết hợp với các định dạng của phương pháp nên làm điều đó. – Joop

Trả lời

2

Tôi chắc chắn bạn đã tìm được giải pháp cho vấn đề này nhưng đối với bất kỳ ai khác tò mò ... Nếu bạn viết DF vào danh sách, bạn có thể ghi nó ra tệp bằng cách cung cấp 'định dạng dưới dạng string'.format (danh sách chỉ số) ví dụ:

df=df.fillna('') 
outF = 'output.txt'  
dbOut = open(temp, 'w') 
v = df.values.T.tolist()   
for i in range(0,dfRows):  
    dbOut.write((\ 
    '{:7.2f}{:>6.2f}{:>2.0f}{:>4.0f}{:>5.0f}{:6.2f}{:6.2f}{:6.2f}{:6.1f {:>15}{:>60}'\ 
    .format(v[0][i],v[1][i],v[2][i],v[3][i],v[4][i],v[5][i],v[6][i],v[7][i],v[8][i],\ 
    v[9][i],v[10][i]))) 
    dbOut.write("\n") 
dbOut.close 

Chỉ cần chắc chắn để phù hợp lên mỗi chỉ số với định dạng đúng :)

Hy vọng rằng sẽ giúp!

5

Cho đến khi một người nào đó implements này trong gấu trúc, bạn có thể sử dụng tabulate gói:

import pandas as pd 
from tabulate import tabulate 

def to_fwf(df, fname): 
    content = tabulate(df.values.tolist(), list(df.columns), tablefmt="plain") 
    open(fname, "w").write(content) 

pd.DataFrame.to_fwf = to_fwf 
+0

Điều này làm việc thanh lịch cho tôi. Rất nhiều saner lộn xộn xung quanh với chuỗi định dạng không gian theo cách thủ công. – DeusXMachina

5

Python, Pandas : write content of DataFrame into text File

Câu hỏi aboves câu trả lời giúp tôi. Nó không phải là tốt nhất, nhưng cho đến to_fwf tồn tại này sẽ làm các trick cho tôi ...

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

hoặc

np.savetxt(r'c:\data\np.txt', df.values, fmt='%10.5f') 
+0

IMO này là tốt hơn so với 'tabulate' kể từ khi gumpy được bao gồm với gấu trúc vì vậy không yêu cầu một thư viện bổ sung – maxymoo

1

Đối với định dạng tùy chỉnh cho mỗi cột bạn có thể thiết lập định dạng cho toàn bộ dòng. thông số fmt cung cấp định dạng cho mỗi dòng

with open('output.dat') as ofile: 
    fmt = '%.0f %02.0f %4.1f %3.0f %4.0f %4.1f %4.0f %4.1f %4.0f' 
    np.savetxt(ofile, df.values, fmt=fmt)