Python列表迭代麻烦

时间:2016-08-26 14:56:39

标签: python windows

我很难搞清楚我在Windows中运行我的python脚本时出错了以获得预期的结果。

我的目录包含 list1.txt,list2.txt,list3.txt,list4.txt list5.txt 。每个列表包含独特的单独行字符串,例如list1.txt,其中<​​strong> item1,item2,item3,item4,和 item5 各自作为单独行上的值。然后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 :(得分: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)

答案 1 :(得分: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)

答案 2 :(得分: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)?下一步:使名称具有描述性。现在看起来似乎并不重要,但一周之后你会问自己“我的意思是这个fis到底是什么意思”。任何IDE都可以更轻松地处理长名称,相信我,写data_file_name或类似的东西比dfs更令人愉快等。不要在循环中导入任何东西。它降低了效率。此外,rootdir变量也可以声明一次。

答案 3 :(得分:0)

您循环浏览所有文件,但只显示最后一个文件的结果。你需要缩进第二个for循环:

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)