for循环将文件读入列表与列表中元素的顺序之间存在差异

时间:2019-07-16 22:18:42

标签: python file for-loop

我目前正在尝试从here读取光谱图文件。当我运行以下代码时,文件的结果将填充一个列表。但是,在行“%.12f”上打印的所有值与手动打印的元素之间存在差异:例如,正确的初始值为0.751491727533,for循环以打印出列表中的所有元素0.003396112601。这确实是一个很奇怪的区别,因为for循环似乎只产生不稳定的gook元素,但是数组的手动索引产生了正确的元素。这不是一个大问题,因为我显然可以按顺序对正确的元素进行索引,但是这使我不知所措,试图弄清行为为何如此不同。

def skipToFrame(spectrogram, offset):
  SAMPLE_RATE =22050
  HOP_LENGTH = 512
  FRAME_TIME = HOP_LENGTH/SAMPLE_RATE
  SHIFT_FRAMES = round(offset/FRAME_TIME)

  a_list = []
  with open(spectrogram) as spectrogram_file:
      for line in spectrogram_file.readlines():
          for entry in line.split(" "):
              a_list.append(float(entry))
      spectrogram_file.close()

  for entry in a_list:
      print("%.12f" % entry)
  print("list length is " + str(len(a_list)))
  print(a_list[0])

def main():
  track_left_spectrogram = "path to file"
  skipToFrame(track_left_spectrogram,1)

if __name__ == '__main__' :
  main()

预期结果应该是,在a_list循环中的for条目中,应根据this文件的值打印出a_list中的值。手动为a_list编制索引显然可以提供正确的结果,但是使用for循环最终可能会导致元素混乱或完全奇怪。

2 个答案:

答案 0 :(得分:0)

a_list = []
with open("sample.txt") as f:
    for line in f.readlines():
        for entry in line.split(" "):
            a_list.append(entry)


for entry in a_list[:-2]:
    print("%.12f" % float(entry))
print("list length is " + str(len(a_list)))
print(a_list[0])

输出为

0.751491727533
2.798113439302
4.068138343604
17.569424700243
32.742568351020
23.357022526269
23.131132464710
9.801858358417
1.490128686136
0.034301546746
0.001143059877
0.000636652547
0.000168888218
0.000133326873
0.000084786511
0.000089979358
0.000030828024
0.000017362478
...
0.751491727533

请注意,当您将with语句与open函数一起使用时,不需要最后关闭文件,因为with会自动为您关闭文件

答案 1 :(得分:0)

该代码似乎工作正常,如果仅打印前10个代码,则显示正确的顺序。如果将它们全部打印出来,我认为您的终端无法显示946176行,因此它会像我的一样将其切断。

for entry in a_list[:10]:
    print("%.12f" % entry)