Python 3.8如何读取文本文件字符串并分配给数组变量
在Python 3.8中读取文本文件内容并分配到数组变量的正确实现
你的代码存在几个关键问题,导致无法正确将数据存入数组(Python中称为列表),以下是修正方案和优化建议:
原代码的核心问题
- 分隔符错误:
line.split("\"\",\"\"")的分割逻辑完全错误,无法正确拆分带双引号的逗号分隔字段。 - 变量覆盖:初始化的列表(如
usbNum=[])在循环中被直接赋值为字符串,导致列表被覆盖,无法累积数据。 - 未处理无效行:文件中的分隔线、空行会引发索引越界错误。
- 大文件兼容性:100万行数据需要高效、低内存的处理方式,手动分割容易出错且效率低。
推荐实现:使用CSV模块(适合大文件+标准格式)
你的文本文件是标准的带引号CSV格式,Python内置的csv模块能自动处理引号、分隔符,且内存效率高,非常适合百万级数据:
import csv # 初始化用于存储数据的列表 usb_num = [] short_description = [] backup_type = [] date_taken = [] # 使用with语句自动管理文件资源,无需手动close with open("myfile.txt", "r", encoding="utf-8") as file: # 配置CSV读取器:指定引号字符、分隔符,忽略字段前的空格 reader = csv.reader(file, quotechar='"', delimiter=',', skipinitialspace=True) for row in reader: # 跳过无效行:分隔线或字段数量不对的行 if len(row) != 4 or row[0].startswith("="): continue # 将数据添加到对应列表 usb_num.append(row[0].upper()) short_description.append(row[1]) backup_type.append(row[2]) date_taken.append(row[3]) # 验证输出结果 for u, dt, b in zip(usb_num, date_taken, backup_type): print(f"{u} taken {dt} for {b}.")
手动分割实现(仅用于理解逻辑,不推荐生产环境)
如果想手动处理字段分割,需修正分割逻辑并避免覆盖列表:
# 初始化存储列表 usb_num = [] short_description = [] backup_type = [] date_taken = [] with open("myfile.txt", "r", encoding="utf-8") as file: for line in file: line = line.strip() # 跳过空行和分隔线 if not line or line.startswith("="): continue # 清理行首尾的双引号,再按'","'分割字段 cleaned_line = line.strip('"') fields = cleaned_line.split('","') # 跳过格式错误的行 if len(fields) != 4: continue # 将数据追加到列表(而非覆盖) usb_num.append(fields[0].upper()) short_description.append(fields[1]) backup_type.append(fields[2]) date_taken.append(fields[3]) # 打印结果 for u, dt, b in zip(usb_num, date_taken, backup_type): print(f"{u} taken {dt} for {b}.")
关键注意事项
- 始终使用
with语句操作文件,避免忘记关闭文件导致资源泄漏。 - 向列表添加数据必须用
append()方法,不能直接赋值覆盖初始化的列表。 - 处理大文件时,逐行读取(上述两种方式均为逐行处理),避免一次性加载所有数据到内存。
- 必须过滤无效行,防止因格式错误引发索引越界异常。
内容的提问来源于stack exchange,提问作者MarsMan63
相关产品推荐
相关产品推荐

