Python列表迭代Troub

2024-10-05 12:20:28 发布

您现在位置:Python中文网/ 问答频道 /正文

为了得到预期的结果,在Windows中运行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)

我需要从数据库中的每个文件读取结果列表.txt文件和每个文件中的每个值,而不仅仅是最后一个文件。我认为我没有正确地进行for循环嵌套,我就是搞不清楚。我还测试了向函数传递参数和定义函数来实现这一点,我完全用软管冲洗了脚本。你知道吗

请任何人帮助我,当你能解决这个问题,我不能明白,只是拉我的头发从头上。你知道吗


Tags: 文件字符串目录txt脚本列表formy
3条回答

看起来你的缩进消失了:

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)

使用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变量可以声明一次。你知道吗

第二个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)

相关问题 更多 >

    热门问题