2015-07-06 26 views
9

Trong mô-đun csv trong python, có một hàm gọi là csv.reader cho phép bạn lặp qua một hàng, trả về đối tượng trình đọc và có thể được giữ trong vùng chứa như danh sách.Xem giá trị hàng trong openpyxl

Vì vậy, khi danh sách được gán cho một biến và được in, ví dụ:

csv_rows = list(csv.reader(csvfile, delimiter=',', quotechar='|')) 
print (csv_rows) 
> 
> 
> 
[['First Name', 'Last Name', 'Zodicac', 'Date of birth', 'Sex'] # I gave an example of the function outputting a header row 

Cho đến nay, tôi không thấy một chức năng tương tự như thế này trong openpyxl. Tôi có thể nhầm lẫn nên tôi tự hỏi liệu có ai trong số các bạn có thể giúp tôi không.

Cập nhật

@alecxe, giải pháp của bạn hoạt động hoàn hảo (trừ đúc của nó ngày sinh của tôi như một định dạng datetime thay vì một chuỗi thường xuyên).

def iter_rows(ws): 
for row in ws.iter_rows(): 
    yield [cell.value for cell in row] 
> 
> 
>>> pprint(list(iter_rows(ws))) 
[['First Nam', 'Last Name', 'Zodicac', 'Date of birth', 'Sex'], ['John', 'Smith', 'Snake', datetime.datetime(1989, 9, 4, 0, 0), 'M']] 

Kể từ khi tôi là một người mới bắt đầu tôi muốn biết làm thế nào điều này sẽ làm việc nếu tôi sử dụng một vòng lặp for thay vì một sự hiểu biết danh sách.

Vì vậy, tôi đã sử dụng này:

def iter_rows(ws): 
result=[] 
for row in ws.iter_rows() 
    for cell in row: 
     result.append(cell.value) 
yield result 

gần mang lại cho tôi cùng một đầu ra chính xác, thay vào đó nó mang lại cho tôi điều này: Như bạn có thể nói, về cơ bản nó mang lại cho tôi một danh sách khổng lồ thay vì danh sách lồng nhau trong kết quả bạn đã cho tôi.

>>>print(list(iter_rows(ws))) 

[['First Nam', 'Last Name', 'Zodicac', 'Date of birth', 'Sex', 'David', 'Yao', 'Snake', datetime.datetime(1989, 9, 4, 0, 0), 'M']] 
+0

Nếu có điều gì đó phù hợp với việc hiểu danh sách thì nó cũng sẽ hoạt động với danh sách. Sự khác biệt giữa hai là danh sách hiểu được tạo ra một danh sách cho mỗi hàng trong bảng tính. Nếu bạn muốn làm điều này trong giải pháp của bạn, bạn sẽ cần phải tạo một danh sách mới cho mỗi hàng và nối kết này vào kết quả. Không có lý do, tuy nhiên, không sử dụng một danh sách hiểu để làm điều này. –

Trả lời

9

iter_rows() có lẽ một cảm giác tương tự:

Trả về một phạm vi bình dựa trên các thông số range_string, sử dụng máy phát điện. Nếu không có phạm vi được thông qua, sẽ lặp qua tất cả các ô trong bảng tính

>>> from openpyxl import load_workbook 
>>> 
>>> wb = load_workbook('test.xlsx') 
>>> ws = wb.get_sheet_by_name('Sheet1') 
>>> 
>>> pprint(list(ws.iter_rows())) 
[(<Cell Sheet1.A1>, 
    <Cell Sheet1.B1>, 
    <Cell Sheet1.C1>, 
    <Cell Sheet1.D1>, 
    <Cell Sheet1.E1>), 
(<Cell Sheet1.A2>, 
    <Cell Sheet1.B2>, 
    <Cell Sheet1.C2>, 
    <Cell Sheet1.D2>, 
    <Cell Sheet1.E2>), 
(<Cell Sheet1.A3>, 
    <Cell Sheet1.B3>, 
    <Cell Sheet1.C3>, 
    <Cell Sheet1.D3>, 
    <Cell Sheet1.E3>)] 

Bạn có thể sửa đổi nó một chút để tạo ra một danh sách các giá trị liên tiếp, ví dụ:

def iter_rows(ws): 
    for row in ws.iter_rows(): 
     yield [cell.value for cell in row] 

Demo:

>>> pprint(list(iter_rows(ws))) 
[[1.0, 1.0, 1.0, None, None], 
[2.0, 2.0, 2.0, None, None], 
[3.0, 3.0, 3.0, None, None]] 
+0

Bị xáo trộn bởi sự hiện diện của bạn alecxe. :) Câu trả lời tuyệt vời như mọi khi. Cảm ơn! – dyao

+0

Tôi tò mò, có cách nào để chuyển đổi danh sách đó thành một vòng lặp for? (chỉ fmi) Cho đến nay, thêm mỗi ô giá trị nó vào một danh sách trống, sau đó 'yield' danh sách không cho tôi kết quả tương tự như giải pháp của bạn – dyao

+0

@bLunt cảm ơn bạn vì những lời tốt đẹp và một câu hỏi thú vị. Chỉ muốn làm rõ những điều sau đây. Kết quả mong muốn của bạn là gì và bạn đang nhận được kết quả gì? – alecxe

-1

tôi đã nhận nó để làm việc bằng thi s phương pháp:

all_rows = [] 

for row in worksheet: 
    current_row = [] 
    for cell in row: 
     current_row.append(cell.value) 
    all_rows.append(current_row) 

Về cơ bản, tôi đã tạo danh sách cho tất cả dữ liệu. Sau đó, tôi lặp qua từng hàng trong bảng tính. Mỗi cell.value trong một hàng đã được thêm vào danh sách ngắn hạn (hàng hiện tại). Khi tất cả các cell.values trong hàng được thêm vào danh sách ngắn hạn, danh sách ngắn hạn sẽ được thêm vào danh sách dài hạn.

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