2012-08-03 22 views
58

İçinde dolaşmak istediğim on dosya içeren bir klasör var. Ben dosyasının adını yazdırmak ne zaman kod çalışıyor:Python ile dosyalara nasıl geçilir?

1 
2 
3 
4 
5 
6 
7 
8 
9 
10 

Ama döngüde dosyayı açmaya eğer bir IO hatası alıyorum:

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

yazdırır Hangi

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' 
>>> 

Dosyanın tam yolunu döngünün içinde geçirmem gerekiyor mu?

+0

bir dizin ağacını çapraz çalışıyorsunuz, ya da sadece belirli bir dizin/klasördeki normal dosyalarla ilgileniyor musunuz? – Levon

+0

Bu sorunun dört yaşında olduğunu biliyorum, ancak yine de kabul edilmiş bir cevabı yok. – raoulcousins

cevap

24

Evet, tam yola ihtiyacın var.

Hızlı düzeltme var mı? Yorumun işaret ettiği gibi, os.walk alt dizinlere giriyor, böylece yol birleştirmenin tabanı olarak indir yerine geçerli dizin kökü kullanmanız gerekiyor.

+5

'os.walk' alt dizinlere iner, bu yüzden burada 'indir' kullanmamalısınız. Root kullan. –

+1

iyi yakalama, güncellendi. – koblas

92

sadece (yani değilbenziyor olmayan bir dizin ağacı, çapraz çalışıyor vardır) tek bir dizinde dosya arıyorsanız, neden sadece os.listdir() kullanın:

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

. os.listdir() için bir dizin yolu parametresi belirtebilirsiniz. os.path.isfile(), belirtilen dosya adının bir dosya için olup olmadığını belirler. the documentation yılında os.walk için

+0

OP'nin döngüsü sadece dosyaları bir dizinde yazdırmaz. Giriş dizininin altındaki her dizinde dosyaları (yinelemeli olarak) yazdırır. – mgilson

+0

@mgilson OP'nin koduna bakarken (OP sadece dosya isimlerini değil, dizinleri ifade eder) ve sorusunun bir kısmının "içinde dolaşmak istediğim on dosya içeren bir klasör" olduğunu görmem gerekir. .. bazı bilgileri atladım mı? – Levon

+0

OP dizin yapısına sahipse: '.' 'File1',' directory1' ve 'directory1'' 'file2' içerir. OP'in kodu 'file1',' file2' basacak, çözümünüz ise 'file1',' directory1' basacaktır. (Üzgünüm, bu yorumlarda açıklamak gerçekten zor). – mgilson

4

örnekler bunun nasıl gösterir:

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

Eğer "açık" fonksiyonu "dize "1" demek olduğunu bilmek bekliyordun nasıl/home/des/test/1 "("/home/des/test "geçerli çalışma dizininiz olmadıkça)?

4

İşte size dosya ağacı yol gösterecektir parçacık İşte:

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

Sen üzerinde çalışıyoruz yolunu belirtmeniz gerekir:

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') 
İlgili konular