2016-08-26 259 views
1

我有一個很難找出我做錯了在Windows中運行我的python腳本來獲得預期的結果。Python列表迭代麻煩

我有一個目錄與list1.txt,list2.txt,list3.txt,list4.txt,並list5.txt。每個列表包含單獨的行字符串,如list1.txt將具有項目1,項目2,項目3,項目4,項目5每個作爲單獨行上的值。然後list2.txt將在不同的行上有item6-item10,依此類推。

我需要做的就是說,對於此目錄中的每個文本文件,列出list1中的每個值直到完成,然後列出list2中的每個值,然後列出list3中的值,直到完成最後一個列表。

這裏是一個鏈接到我的結果的圖象與筆記:https://i.imgur.com/YBxQUqi.png

的代碼我有以下,但結果不是我期待,我有一個堅硬的極端時間確定什麼,我在這裏做錯了。

def my_range(start, end, step): 
    while start <= end: 
     yield start 
     start += step 

for x in my_range(1, 5, 1): 
    import os 
    rootdir = os.getcwd() 
    fis = rootdir + "\list\list" + str(x) + ".txt" 
    files = open(fis,'rU') 
    lines = files.readlines() 
    print(lines) 
    print(fis) 
for line in lines: 
     print("Item = " + line) 

我需要的結果從lists.txt文件中的每個文件,並從每個值中的每個文件,而不是僅在過去的文件中讀取。我認爲我沒有正確的嵌套for循環,我只是無法弄清楚。我還測試了傳遞參數給一個函數,並定義了一個函數來完成這個任務,並且我完全理解了這個腳本。

任何人都可以幫助我,當你可以解決這個問題我無法弄清楚,只是把頭髮拉出來。

+4

專業提示:如果可能,請始終在您的問題中包含您的輸出,因爲鏈接會隨着時間而中斷。 –

+0

看起來這可能只是我的一個縮進問題。嘗試用倒數第二行縮進 – StephenTG

+0

@SlickNutz,除非我錯了,發佈圖片或文字不需要代表。 –

回答

4

您的第二個for循環需要是主循環的子循環。另外,每次循環時都不要輸入import os,只需執行一次即可。您的代碼應該是這樣的:

def my_range(start, end, step): 
    while start <= end: 
     yield start 
     start += step 
import os 
for x in my_range(1, 5, 1): 
    rootdir = os.getcwd() 
    fis = rootdir + "\list\list" + str(x) + ".txt" 
    files = open(fis,'rU') 
    lines = files.readlines() 
    print(lines) 
    print(fis) 
    for line in lines: 
     print("Item = " + line) 

不過,我會評論說,你應該使用一個with open(fid,'rU') as f:方法,因爲這將被鎖定釋放文件,如果代碼中的錯誤出或崩潰。那麼你可以做這樣的事情:

def my_range(start, end, step): 
    while start <= end: 
     yield start 
     start += step 
import os 
for x in my_range(1, 5, 1): 
    rootdir = os.getcwd() 
    fis = rootdir + "\list\list" + str(x) + ".txt" 
    with open(fis,'rU') as files: 
     print(fis) 
     for line in files: 
      print("Item = " + line) 
0

你正在循環所有的文件,但只顯示最後一個文件的結果。您需要縮進循環第二:

for x in my_range(1, 5, 1): 
    import os 
    rootdir = os.getcwd() 
    fis = rootdir + "\list\list" + str(x) + ".txt" 
    files = open(fis,'rU') 
    lines = files.readlines() 
    print(lines) 
    print(fis) 
    for line in lines: #INDENT LIKE SO 
     print("Item = " + line) 
+1

您的代碼語法不正確,請修復,因爲它不起作用。 – dblclik

+0

是的,我沒有正確縮進自己。固定 –

1

它看起來像你的縮進熄滅:

for x in my_range(1, 5, 1): 
    import os 
    ... 
for line in lines:    # this should be inside the loop 
     print("Item = " + line) 

但是,你要了解這是一個非常迂迴的方式,我建議是這樣的:

for root, dirs, files in os.walk(starting_dir): # iterate over directory 
    for f in files:        # iterate over files 
    with open(f) as in_file:     # open file 
     for line in in_file.readlines():   # iterate over lines 
     print line        # print each line (or do something else) 
1

使用os.path.join創建文件路徑。我做了一些改進,我會在下面討論。

#!/usr/bin/env python 

import os 
rootdir = os.getcwd() 

for x in range(1, 4): 
    filename = 'list' + str(x) + '.txt' 
    fis = os.path.join(rootdir, 'list', filename) 
    files = open(fis,'rU') 
    lines = files.readlines() 
    print(lines) 
    print(fis) 
for line in lines: 
     print("Item = " + line) 

我也沒有看到讓自己可迭代的任何一點。爲什麼不在開始時簡單使用range(1, 5)?下一步:使名稱具有描述性。現在看起來似乎並不重要,但一週之後,你會問自己:「我到底想幹什麼」。任何IDE都可以讓長名字工作更容易,相信我,編寫data_file_name或類似的東西比dfs更令人愉快。不要在循環中導入任何東西。它降低了效率。另外rootdir變量可以聲明一次。