值得退后一步,问问你想在这里做什么。
f 已经是一个可迭代的行:你可以用for line in f: 循环。但它是“懒惰的”——一旦你循环它一次,它就消失了。而且它不是一个序列——你可以循环它,但你不能用索引或像f[20]或f[-10:]这样的切片随机访问它。
f.readlines() 将其复制到行列表中:您可以循环并索引。虽然文件为此具有 readlines 方法,但这并不是真正必要的——您可以通过调用 list(f) 将 any 可迭代转换为这样的列表。
您的循环似乎是在尝试创建另一个相同行的列表。您只需使用list(data) 即可。虽然不清楚为什么首先需要另一个列表。
此外,“数组”一词可能会引起混淆。
Python 列表是一个动态数组,可以索引和修改,也可以通过追加、插入和删除元素来调整大小。所以,从技术上讲,arr 是一个数组。
但通常当人们在 Python 中谈论“数组”时,他们指的是固定大小的数组,通常是固定大小的对象,例如 stdlib array 模块、第三方 numpy 库提供的对象,或者特殊用途类型,例如内置 bytearray。
一般来说,将列表或其他可迭代对象转换为其中任何一个都与转换为列表相同:只需调用构造函数即可。例如,如果您有一个 0-255 之间的数字列表,您可以使用bytearray(lst) 来获取相同数字的字节数组。或者,如果您有一个浮点值列表,np.array(lst) 将为您提供一个 2D numpy 浮点数组。以此类推。
那么,为什么你的代码不起作用?
当您编写arr = [] 时,您正在创建一个包含 0 个元素的列表。
当您编写arr[count] = s 时,您尝试将列表中的countth 元素设置为s。但是 没有 countth 元素。您正在写超出列表末尾的内容。
一种选择是改为致电arr.append(s)。这使得列表 1 元素比以前更长,并将 s 放入新槽中。
另一种选择是首先创建一个大小合适的列表,例如arr = [None for _ in data]。然后,arr[count] = s 可以将countth 槽中的None 替换为s。
但如果你真的只是想在另一个列表中复制data,最好只使用arr = list(data) 或arr = data[:]。
如果您不需要其他副本,只需使用arr = data,或按原样使用data — 或者,如果它满足您的需求,只需在第一个使用f地点。