在python中读取文件时如何将字符串作为整数读取
我在文本文件的特定部分读取了以下代码行。问题是这些数字不是字符串,所以我想将它们转换为整数,并将它们读入某种类型的列表中 文本文件中的数据示例如下所示: 然而,这并不完全具有代表性,我在这里上传了完整的数据集:作为文本文件 *NSET,NSET=节点\u向后推\u IB在python中读取文件时如何将字符串作为整数读取,python,Python,我在文本文件的特定部分读取了以下代码行。问题是这些数字不是字符串,所以我想将它们转换为整数,并将它们读入某种类型的列表中 文本文件中的数据示例如下所示: 然而,这并不完全具有代表性,我在这里上传了完整的数据集:作为文本文件 *NSET,NSET=节点\u向后推\u IB 99915527、99915529、99915530、99915532、99915533、99915548、99915549、99915550、, 99915551, 99915552, 99915553, 9991555
99915527、99915529、99915530、99915532、99915533、99915548、99915549、99915550、,
99915551, 99915552, 99915553, 99915554, 99915555, 99915556, 99915557, 99915558,
99915562, 99915563, 99915564, 99915656, 99915657, 99915658, 99915659, 99915660,
99915661, 99915662, 99915663, 99915664, 99915665, 99915666, 99915667, 99915668,
99915669, 99915670, 99915885, 99915886, 99915887, 99915888, 99915889, 99915890,
99915891, 99915892, 99915893, 99915894, 99915895, 99915896, 99915897, 99915898,
99915899, 99915900, 99916042, 99916043, 99916044, 99916045, 99916046, 99916047,
99916048、99916049、99916050
*NSET,NSET=节点\u向后推\u OB
任何帮助都将不胜感激
嗨,我仍然被这个问题困扰着还有什么建议吗?最新代码和错误消息如下,谢谢
import tkinter as tk
from tkinter import filedialog
file_path = filedialog.askopenfilename()
print(file_path)
data = []
data2 = []
data3 = []
flag= False
with open(file_path,'r') as f:
for line in f:
if line.strip().startswith('*NSET, NSET=Nodes_Pushed_Back_IB'):
flag= True
elif line.strip().endswith('*NSET, NSET=Nodes_Pushed_Back_OB'):
flag= False #loop stops when condition is false i.e if false do nothing
elif flag: # as long as flag is true append
data.append([int(x) for x in line.strip().split(',')])
result is the following error:
ValueError: invalid literal for int() with base 10: ''
我希望每个字符串都是列表中的一个数字,而不是作为字符串来读取,即
[98932850 98932852 98932853 98932855 98932856 98932871 98932872 98932873]
在这种情况下,我将正则表达式与字符串方法一起使用。我会这样解决这个问题:
import re
with open(filepath) as f:
txt = f.read()
g = re.search(r'NSET=Nodes_Pushed_Back_IB(.*)', txt, re.S)
snums = g.group(1).replace(',', ' ').split()
numbers = [int(num) for num in snums]
我将全文读入txt
。
接下来,我使用一个正则表达式,并使用文本中标题的最后一部分作为锚定符,用捕获括号捕获其余部分(re.S标志意味着点也应该捕获换行符)。我通过g.group(1)
将所有数字作为一个文本单元访问
下一个。我删除了所有的逗号(实际上用空格替换),因为在生成的文本上我使用了split()
,这是一个很好的函数,可以用于用空格分隔的文本项上——不管空格的数量有多大,它只是按照您的意图将其拆分
其余的只是使用列表理解将文本转换为数字。您的行包含多个数字和一些分隔字符。您可以通过明智地应用
split
和strip
来解析该格式,或者通过让re
专门提取您关心的字段来最小化字符串处理:
ints = list(map(int, re.findall(r'-?\d+', line)))
此正则表达式将查找每组数字(可选地以减号作为前缀),然后
map
将int
应用于找到的每组数字 使用字符串样本:
strings = ' 98932850, 98932852, 98932853, 98932855, 98932856, 98932871, 98932872, 98932873,\n'
我只是拆分字符串,去掉逗号,然后返回一个数字列表:
numbers = [ int(s.strip(',')) for s in strings.split() ]
基于您的评论并考虑代码的更大上下文。我有几点建议:
from itertools import groupby
number_groups = []
with open('data.txt', 'r') as f:
for k, g in groupby(f, key=lambda x: x.startswith('*NSET')):
if k:
pass
else:
number_groups += list(filter('\n'.__ne__, list(g))) #remove newlines in list
data = []
for group in number_groups:
for str_num in group.strip('\n').split(','):
data.append(int(str_num))
在您的代码中,是否有以“*NSET,NSET=Nodes\u push\u Back\u IB”开头的行?我们需要看到这条线的完美表现。然后你需要拆分有效行。是的,我在上面的原始问题中编辑了示例数据,包括“*NSET,NSET=Nodes\u push\u Back\u IB”的位置。数据集相当大,因此未包含所有数据,但上述数据具有代表性。然后我应该有:data.append(strip().split(“,”)?然后如何将值转换为int。谢谢。您好,我在现有代码行的末尾尝试了此操作,但出现以下错误:AttributeError:“list”对象没有属性“split”。如果您有字符串列表,则更简单:只需删除split()函数。感谢您的帮助,我希望将当前的代码与您的第一个建议相结合。我已经在我的原始问题中编辑了代码。我不明白为什么这不起作用。@Jay我猜你有一个字符串列表。而且,您正在尝试拆分列表而不是字符串。在我的示例中,我加入了两个变量,
group
和str_num
,以突出这个问题。您好,谢谢。但是,即使使用您建议的第二个代码,我仍然无法实现这一点。我已经上传了完整的数据集作为一个文本文件在原来的职位,因为我意识到格式略有不同。我试图将data.append(line.strip())
替换为data.append([int(x)代表行中的x.replace(“,”).split(“,”)])
。然而,这仍然不起作用。split函数似乎可以解决这个问题,但是它仍然抛出了一个关于ValueError:invalid literal for int()的错误,以10为基数:'\n'
,因此我似乎无法删除空格。我认为这是在我拆分时出现的。您好,在尝试此操作时,我遇到了以下错误:ValueError:invalid literal for int(),以10为基数:“*NSET”请确保复制程序的原样。正则表达式去掉了头。