2012-08-03 5 views
0

폴더 안의 파일을 읽으려고합니다. 이유는 폴더 안의 파일 수가 고정되어 있지 않지만, 3 개의 텍스트 폴더가 있으면 3 가지를 모두 읽어야합니다. 파일 4 개 모두 4 개의 텍스트 파일. 여기 디렉토리 안의 파일에서 읽는 중에 오류가 발생했습니다.

내가 사용하려고 해요 코드이지만, IOError가 함께 제공 :

for i in os.listdir("./RecordFolder"): 
    print i 

출력은 다음과 같습니다 record1.txt record2.txt

이제 문제는을 읽고 파일 :

for files in os.listdir("./RecordFolder"): 
    filecontent = open(files).readlines() 
    for lines in filecontent: 
    print lines 

출력 :

IOError: [Errno 2] No such file or directory: 'record.txt' 

여기에 몇 가지 도움이 필요, 감사

답변

10

디렉터리 이름을 추가 os.path.join()를 사용해야하므로 os.listdir() 만, 파일 이름이 아닌 전체 경로를 반환 기능 :

directory = "./RecordFolder" 
for filename in os.listdir(directory): 
    with open(os.path.join(directory, filename)) as f: 
     for line in f: 
      print line 

(또한 당신은 단순히 이상 반복에 대한 file.readlines()를 사용하지 않도록주의 파일의 줄 및 코드가 파일을 닫지 못하는 것입니다. 이러한 문제는 위의 코드에서 수정되었습니다.)

+0

예 .. : D 이것은 내가 stackoverflow처럼, 샘을 달성하는 방법을 많이 알게되는 이유입니다 e thing :) 감사합니다 @ Sven Marnach – Whiskey

+0

records.txt가 MB의 거대한 파일 인 경우 다른 작은 질문이 있습니다. for 루프를 사용하는 것이 좋은 생각입니까? 아니면 다른 방법이 있습니까? @mgilson – Whiskey

+1

@Whiskey - 그것은 당신이 원하는/라인에서 벗어나기 위해 필요한 것에 조금 의존합니다. 정보에서 목록을 작성하는 경우 '목록 이해'또는 '지도'를 사용할 수 있습니다. 그러나 이것이 실제로 좋은 아이디어인지 여부는 처리가 얼마나 어려운지에 달려 있습니다. 예를 들어 :'[line in line for f]'는 그렇게 나쁘지는 않지만 실제로리스트를 만들지 않으려면'for' 루프를 사용하십시오. 성능이 크게 다를 것은 아닙니다. – mgilson

2

os.listdir 만 폴더에있는 파일의 이름을 반환합니다. 전체 경로가 아닙니다.

당신은 같은 것을 원하는 :

directory = os.path.join(os.curdir, "RecordFolder") 
for files in os.listdir(directory): 
    filecontent = open(os.path.join(directory, files)).readlines() 
    for lines in filecontent: 
     print lines 

을하지만이 파일에서 라인을 얻을 수있는 가장 좋은 방법이 아닙니다. 파이썬 컨텍스트 관리자로 봐 - 특별히 :

with open(filename) as f: 
    for line in f: 
     print line 

이 파일이 제대로 닫혀 있는지 확인합니다 (심지어 오류의 경우에 - 인터프리터 자체 또는 그런 기괴한 뭔가 세그먼트 오류를 ​​금지).

+0

감사합니다, 지금 나는 어디에서 잘못되었는지 알고 있습니다. – Whiskey

관련 문제