2013-07-24 51 views
23

Thư viện Python có thể đọc bảng tính Excel và chuyển đổi chúng thành pandas.DataFrame với lệnh pandas.read_excel(file). Dưới mui xe, nó sử dụng thư viện xlrddoes not support tệp ods.Làm thế nào để chuyển đổi bảng tính OpenDocument thành một DataFrame gấu trúc?

Có tương đương với pandas.read_excel cho các tệp ods không? Nếu không, làm thế nào tôi có thể làm tương tự cho một bảng tính được định dạng tài liệu mở (tệp ods)? ODF được sử dụng bởi LibreOffice và OpenOffice.

Trả lời

1

Nếu có thể, hãy lưu dưới dạng CSV từ ứng dụng bảng tính và sau đó sử dụng pandas.read_csv(). IIRC, tệp bảng tính 'ods' thực sự là một tệp XML cũng chứa một số thông tin định dạng. Vì vậy, nếu đó là về dữ liệu dạng bảng, trích xuất dữ liệu thô này trước tiên thành tệp trung gian (CSV, trong trường hợp này), sau đó bạn có thể phân tích cú pháp với các chương trình khác, chẳng hạn như Python/gấu trúc.

+0

Cảm ơn. Sẽ tốt nếu có cái gì đó trực tiếp hơn, nhưng tôi đoán đó là một khả năng. – Lamps1829

+0

Không có gì trực tiếp hơn tệp chỉ chứa dữ liệu thô. Các tệp như vậy phải ở định dạng tệp nhất định. Có các định dạng nhị phân cho định dạng này (chẳng hạn như NetCDF hoặc HDF5) và định dạng ascii, chẳng hạn như CSV. Thật không may, CSV không phải là một tiêu chuẩn thực sự. Tuy nhiên, CSV là khá thẳng về phía trước để đối phó với trong hầu hết các tình huống. –

3

Tùy chọn khác: read-ods-with-odfpy. Mô-đun này lấy Bảng tính Tài liệu Mở làm đầu vào và trả về một danh sách, trong đó có thể tạo một DataFrame.

1

Có hỗ trợ đọc tệp Excel trong Pandas (cả xls và xlsx), xem lệnh read_excel. Bạn có thể sử dụng OpenOffice để lưu bảng tính dưới dạng xlsx. Việc chuyển đổi cũng có thể được thực hiện tự động trên dòng lệnh, rõ ràng, bằng cách sử dụng convert-to command line parameter.

Đọc dữ liệu từ xlsx tránh một số vấn đề (định dạng ngày, định dạng số, unicode) mà bạn có thể gặp phải khi chuyển đổi thành CSV trước.

1

Có vẻ như câu trả lời là Không! Và tôi sẽ mô tả các công cụ để đọc trong ODS vẫn bị rách rưới. Nếu bạn đang ở trên POSIX, có lẽ chiến lược xuất khẩu sang xlsx một cách nhanh chóng trước khi sử dụng công cụ nhập khẩu rất đẹp Pandas' cho xlsx là một lựa chọn:

unoconv -f xlsx -o tmp.xlsx myODSfile.ods 

Nhìn chung, mã của tôi trông giống như:

import pandas as pd 
import os 
if fileOlderThan('tmp.xlsx','myODSfile.ods'): 
    os.system('unoconv -f xlsx -o tmp.xlsx myODSfile.ods ') 
xl_file = pd.ExcelFile('tmp.xlsx') 
dfs = {sheet_name: xl_file.parse(sheet_name) 
      for sheet_name in xl_file.sheet_names} 
df=dfs['Sheet1'] 

Ở đây tệpOlderThan() là một hàm (xem http://github.com/cpbl/cpblUtilities) trả về true nếu tmp.xlsx không tồn tại hoặc lớn hơn tệp .ods.

8

Bạn có thể đọc các tài liệu ODF (Open Document Format) trong Python sử dụng các module sau:

Sử dụng ezodf, một đơn giản ODS-to Bộ chuyển đổi -DataFrame có thể trông giống như sau:

import pandas as pd 
import ezodf 

doc = ezodf.opendoc('some_odf_spreadsheet.ods') 

print("Spreadsheet contains %d sheet(s)." % len(doc.sheets)) 
for sheet in doc.sheets: 
    print("-"*40) 
    print(" Sheet name : '%s'" % sheet.name) 
    print("Size of Sheet : (rows=%d, cols=%d)" % (sheet.nrows(), sheet.ncols())) 

# convert the first sheet to a pandas.DataFrame 
sheet = doc.sheets[0] 
df_dict = {} 
for i, row in enumerate(sheet.rows()): 
    # row is a list of cells 
    # assume the header is on the first row 
    if i == 0: 
     # columns as lists in a dictionary 
     df_dict = {cell.value:[] for cell in row} 
     # create index for the column headers 
     col_index = {j:cell.value for j, cell in enumerate(row)} 
     continue 
    for j, cell in enumerate(row): 
     # use header instead of column index 
     df_dict[col_index[j]].append(cell.value) 
# and convert to a DataFrame 
df = pd.DataFrame(df_dict) 

Hỗ trợ bảng tính ODF (* .ods) đã được yêu cầu trên trình theo dõi vấn đề pandas: https://github.com/pydata/pandas/issues/2311 nhưng vẫn chưa được triển khai.

ezodf được sử dụng trong số chưa hoàn thành PR9070 để triển khai hỗ trợ ODF trong gấu trúc. PR đó hiện đã bị đóng (đọc PR cho một cuộc thảo luận kỹ thuật), nhưng nó vẫn có sẵn như một tính năng thử nghiệm ở thispandas ngã ba.

+0

Hoạt động rất tốt. Bạn nên cung cấp một cái gì đó như thế này như là một gói bên ngoài (phụ thuộc vào cả 'ezodf' và' pandas') để người dùng cuối cùng có thể có một hàm read_ods()! – Antonello

1

Dưới đây là một hack nhanh chóng và dơ bẩn trong đó sử dụng ezodf mô-đun:

import pandas as pd 
import ezodf 

def read_ods(filename, sheet_no=0, header=0): 
    tab = ezodf.opendoc(filename=filename).sheets[sheet_no] 
    return pd.DataFrame({col[header].value:[x.value for x in col[header+1:]] 
         for col in tab.columns()}) 

Test:

In [92]: df = read_ods(filename=fn) 

In [93]: df 
Out[93]: 
    a b c 
0 1.0 2.0 3.0 
1 4.0 5.0 6.0 
2 7.0 8.0 9.0 

Chú ý: tất cả các thông số khác hữu ích như header, skiprows, index_col, parse_cols KHÔNG thực hiện trong chức năng này - vui lòng cập nhật câu hỏi này nếu bạn muốn triển khai chúng

0

Nếu bạn chỉ có một vài tệp .ods để đọc, tôi sẽ chỉ mở nó trong openoffice và lưu nó dưới dạng tệp excel. Nếu bạn có rất nhiều các tập tin, bạn có thể sử dụng unoconv command trong Linux để chuyển đổi các tập tin .ods để .xls lập trình (with bash)

Sau đó, nó thực sự dễ dàng để đọc nó với pd.read_excel('filename.xls')

Các vấn đề liên quan