2016-08-26 182 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变量可以声明一次。