【问题标题】:How to correct this for-loop code?如何更正此 for 循环代码?
【发布时间】:2012-12-03 06:06:57
【问题描述】:
# Define the project name and path for input files
# need to use \ before \t and \ to print these characters
Project = "101"
path_Directory =  "C:\Users\\tp\Desktop\project\\"
full_path_Directory = path_Directory + Project

# Set path for files in the program
File_stock = full_path_Directory + "_stock.txt"
File_exchange = full_path_Directory + "_exchange.txt"
File_country = full_path_Directory + "_country.txt"

var_set = [File_stock, File_exchange, File_country]

  for var in var_set:
    var = open(var,'r')
    var = var.read()[3:]
    print var

我创建了一个 var_set 来包含 3 个变量 - File_stock、File_exchange 和 File_country,因为我认为循环执行重复性任务会更有效。虽然上面显示的代码的输出是正确的,但是当我输入:“打印股票”或“打印交换”或打印“国家”时,输出总是错误的,因为它显示的是路径目录而不是文本文件中的数据.

有谁知道可能是什么原因以及我应该如何解决它?

【问题讨论】:

  • 您的代码不包含stockexchangecountry 的任何定义。您的变量名称当前不匹配。
  • 提示:使用原始字符串文字以避免 \ 被解释为转义码:r'C:\Users\tp\Desktop\project'。但是,您不能使用斜杠作为最后一个字符。 os.path.join() 非常适合生成更长的路径。 os.path.join(path_Directory, Project).
  • 马丁,对不起。 stock 应该是 File_stock,exchange 应该是 File_exchange,country 应该是 File_country。好的,我将通过编写 path_Directory = os.path.join(path_Directory, Project) 来导入 os 并设置路径。再次感谢!
  • 再次,您可以edit您的问题来纠正错误。
  • 表示感谢。我将通过买一本关于 Python 的书来打下良好的基础。有什么建议吗?

标签: for-loop python-2.7 performance


【解决方案1】:

如果您想将每个文件的数据存储在数据结构中,您需要使用dict 或类似名称:

Project = "101"

path_Directory =  r"C:\Users\tp\Desktop\project"
names = ['stock', 'exchange', 'country']
data = {}

for name in names:
    path = os.path.join(path_Directory, '{0}_{1}.txt'.format(Project, name))
    data[name] = open(path, 'r').read(3)

我还将您的.read()[:3] 替换为.read(3),只读取三个字符而不是读取整个文件;它更有效。

现在data 将有三个键,每个指向从每个文件中读取的 3 个字符:

print data['stock']  # prints 'xyz'. etc.

【讨论】:

  • Martijn,我试图去掉每个文件中的前 3 个字符。我怀疑这是由于一些编码问题。它出现在每个文本文件中。顺便问一下,{0}_{1} 代表什么?
  • 知道了! 0 代表项目名称,1 代表变量名称。非常优雅!
  • 啊,确实,不是前三个,而是所有前三个。 :-) 是的,使用的字符串格式化语法可以在这里找到:docs.python.org/2/library/string.html#format-string-syntax
  • @TingPing:我怀疑前 3 个字节是 UTF-8 BOM;检查codecs.BOM_UTF8。如果是这样,请执行.read().decode('utf_8_sig'] 以获取 unicode 数据。
猜你喜欢
  • 1970-01-01
  • 2022-01-18
  • 1970-01-01
  • 1970-01-01
  • 2019-05-17
  • 2023-01-22
  • 2020-09-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多