2012-08-03 35 views
58

Tôi có một thư mục có mười tệp mà tôi muốn lặp qua. Khi tôi in ra tên của tập tin mã của tôi hoạt động tốt:Làm cách nào để lặp lại các tệp bằng Python?

import os 
indir = '/home/des/test' 
for root, dirs, filenames in os.walk(indir): 
    for f in filenames: 
     print(f) 

nào in:

1 
2 
3 
4 
5 
6 
7 
8 
9 
10 

Nhưng nếu tôi cố gắng để mở tập tin trong vòng lặp Tôi nhận được một lỗi IO:

import os 
indir = '/home/des/test' 
for root, dirs, filenames in os.walk(indir): 
    for f in filenames: 
     log = open(f, 'r') 

Traceback (most recent call last): 
File "/home/des/my_python_progs/loop_over_dir.py", line 6, in <module> 
log = open(f, 'r') 
IOError: [Errno 2] No such file or directory: '1' 
>>> 

Tôi có cần chuyển toàn bộ đường dẫn của tệp ngay cả trong vòng lặp không?

+0

bạn đang cố gắng để đi qua một cây thư mục, hoặc là bạn chỉ quan tâm đến các tập tin thông thường trong một thư mục/thư mục cụ thể? – Levon

+0

Tôi biết câu hỏi này là bốn tuổi, nhưng nó vẫn không có câu trả lời được chấp nhận. – raoulcousins

Trả lời

24

Có, bạn cần đường dẫn đầy đủ.

log = open(os.path.join(root, f), 'r') 

Khắc phục nhanh chóng. Khi nhận xét được chỉ ra, os.walk sẽ chuyển thành các thư mục con, do đó bạn cần phải sử dụng thư mục gốc hiện tại thay vì indir làm cơ sở để tham gia đường dẫn.

+5

'os.walk' xuống thành các subdir, vì vậy bạn không nên sử dụng' indir' tại đây. Sử dụng 'root'. –

+1

bắt tốt, cập nhật. – koblas

92

Nếu bạn chỉ là tìm kiếm các tập tin trong một thư mục duy nhất (tức là bạn đang không cố gắng để đi qua một cây thư mục, mà nó không giống như), tại sao không chỉ cần sử dụng os.listdir():

import os 
for fn in os.listdir('.'): 
    if os.path.isfile(fn): 
     print (fn) 

thay cho os.walk(). Bạn có thể chỉ định đường dẫn thư mục làm thông số cho os.listdir(). os.path.isfile() sẽ xác định xem tên tệp đã cho có dành cho tệp hay không.

+0

vòng lặp của OP không chỉ in các tệp trong một thư mục. Nó in các tập tin (đệ quy) trong mỗi thư mục undearneath trong thư mục đầu vào là tốt. – mgilson

+0

@mgilson Tôi phải mất tích khi xem mã OP (OP chỉ đề cập đến tên tập tin không phải là thư mục) và một phần của câu hỏi đã đọc "thư mục có mười tệp trong đó tôi muốn lặp lại." .. Tôi đã bỏ qua một số thông tin? – Levon

+0

Nếu OP có cấu trúc thư mục: '.' chứa' file1', 'directory1' và' directory1' chứa 'tệp2'. mã OP sẽ in 'file1',' file2' trong khi giải pháp của bạn sẽ in 'file1',' directory1'. (xin lỗi, điều này thực sự khó giải thích trong nhận xét). – mgilson

4

Các ví dụ để os.walk trong the documentation thấy làm thế nào để làm điều này:

for root, dirs, filenames in os.walk(indir): 
    for f in filenames: 
     log = open(os.path.join(root, f),'r') 

Làm thế nào mà bạn mong đợi chức năng "mở" để biết rằng chuỗi "1" có nghĩa vụ phải có nghĩa là "/ home/des/test/1 "(trừ khi"/home/des/test "xảy ra là thư mục làm việc hiện tại của bạn)?

4

Dưới đây là một đoạn mã mà sẽ đi bộ với cây tập tin cho bạn:

indir = '/home/des/test' 
for root, dirs, filenames in os.walk(indir): 
    for f in filenames: 
     print(f) 
     log = open(indir + f, 'r') 
7

Bạn phải chỉ định đường dẫn mà bạn đang làm việc trên:

source = '/home/test/py_test/' 
for root, dirs, filenames in os.walk(source): 
    for f in filenames: 
     print f 
     fullpath = os.path.join(source, f) 
     log = open(fullpath, 'r') 
Các vấn đề liên quan