为什么我在使用 split() 时得到空列表?
why I am getting empty list when I use split()?
我有一个文本文件:
-- Generated ]
FILEUNIT
METRIC /
Hello
-- timestep: Jan 01,2017 00:00:00
3*2 344.0392 343.4564 343.7741
343.9302 343.3884 343.7685 0.0000 341.0843
342.2441 342.5899 343.0728 343.4850 342.8882
342.0056 342.0564 341.9619 341.8840 342.0447 /
我写了一个代码来读取文件并删除单词、字符和空行,并对其进行一些其他处理,最后 return 最后四行中的那些数字。我无法理解如何将文本文件的所有数字正确地放入列表中。现在 new_line 生成一个字符串,其中包含数字
import string
def expand(chunk):
l = chunk.split("*")
chunk = [str(float(l[1]))] * int(l[0])
return chunk
with open('old_textfile.txt', 'r') as infile1:
for line in infile1:
if set(string.ascii_letters.replace("e","")) & set(line):
continue
chunks = line.split(" ")
#Get rid of newlines
chunks = list(map(lambda chunk: chunk.strip(), chunks))
if "/" in chunks:
chunks.remove("/")
new_chunks = []
for i in range(len(chunks)):
if '*' in chunks[i]:
new_chunks += expand(chunks[i])
else:
new_chunks.append(chunks[i])
new_chunks[len(new_chunks)-1] = new_chunks[len(new_chunks)-1]+"\n"
new_line = " ".join(new_chunks)
当我使用
A = new_line.split()
B = list(map(float, A))
它return是一个空列表。你知道我如何将所有这些数字放在一个列表中吗?
目前,我正在将 new_line
作为文本文件编写并再次阅读,但它增加了我的运行时间,这并不好。
f = open('new_textfile.txt').read()
A = f.split()
B = list(map(float, A))
list_1.extend(B)
还有一个使用 Regex 的解决方案,但它删除了 3*2
。我想将其处理为 2 2 2
import re
with open('old_textfile.txt', 'r') as infile1:
lines = infile1.read()
nums = re.findall(r'\d+\.\d+', lines)
print(nums)
我不太确定我是否完全理解你正在尝试做的事情,但据我了解,你想要提取所有数字,这些数字要么是小数形式 \d+\.\d+
要么是整数使用星号乘以另一个整数,所以 \d+\*\d+
。您希望所有结果都在浮点数列表中,其中小数直接在列表中,对于整数,第二个由第一个重复。
一种方法是:
lines = """
-- Generated ]
FILEUNIT
METRIC /
Hello
-- timestep: Jan 01,2017 00:00:00
3*2 344.0392 343.4564 343.7741
343.9302 343.3884 343.7685 0.0000 341.0843
342.2441 342.5899 343.0728 343.4850 342.8882
342.0056 342.0564 341.9619 341.8840 342.0447 /
"""
nums = []
for n in re.findall(r'(\d+\.\d+|\d+\*\d+)', lines):
split_by_ast = n.split("*")
if len(split_by_ast) == 1:
nums += [float(split_by_ast[0])]
else:
nums += [float(split_by_ast[1])] * int(split_by_ast[0])
print(nums)
哪个returns:
[2.0, 2.0, 2.0, 344.0392, 343.4564, 343.7741, 343.9302, 343.3884, 343.7685, 0.0, 341.0843, 342.2441, 342.5899, 343.0728, 343.485, 342.8882, 342.0056, 342.0564, 341.9619, 341.884, 342.0447]
正则表达式搜索与其中一种格式(十进制或 int*int
)匹配的数字。然后在十进制的情况下,它直接附加到列表中,在 int*int 的情况下,它被解析为一个较小的列表,将第二个 int 重复第一个 int 次,然后将列表连接起来。
我有一个文本文件:
-- Generated ]
FILEUNIT
METRIC /
Hello
-- timestep: Jan 01,2017 00:00:00
3*2 344.0392 343.4564 343.7741
343.9302 343.3884 343.7685 0.0000 341.0843
342.2441 342.5899 343.0728 343.4850 342.8882
342.0056 342.0564 341.9619 341.8840 342.0447 /
我写了一个代码来读取文件并删除单词、字符和空行,并对其进行一些其他处理,最后 return 最后四行中的那些数字。我无法理解如何将文本文件的所有数字正确地放入列表中。现在 new_line 生成一个字符串,其中包含数字
import string
def expand(chunk):
l = chunk.split("*")
chunk = [str(float(l[1]))] * int(l[0])
return chunk
with open('old_textfile.txt', 'r') as infile1:
for line in infile1:
if set(string.ascii_letters.replace("e","")) & set(line):
continue
chunks = line.split(" ")
#Get rid of newlines
chunks = list(map(lambda chunk: chunk.strip(), chunks))
if "/" in chunks:
chunks.remove("/")
new_chunks = []
for i in range(len(chunks)):
if '*' in chunks[i]:
new_chunks += expand(chunks[i])
else:
new_chunks.append(chunks[i])
new_chunks[len(new_chunks)-1] = new_chunks[len(new_chunks)-1]+"\n"
new_line = " ".join(new_chunks)
当我使用
A = new_line.split()
B = list(map(float, A))
它return是一个空列表。你知道我如何将所有这些数字放在一个列表中吗?
目前,我正在将 new_line
作为文本文件编写并再次阅读,但它增加了我的运行时间,这并不好。
f = open('new_textfile.txt').read()
A = f.split()
B = list(map(float, A))
list_1.extend(B)
还有一个使用 Regex 的解决方案,但它删除了 3*2
。我想将其处理为 2 2 2
import re
with open('old_textfile.txt', 'r') as infile1:
lines = infile1.read()
nums = re.findall(r'\d+\.\d+', lines)
print(nums)
我不太确定我是否完全理解你正在尝试做的事情,但据我了解,你想要提取所有数字,这些数字要么是小数形式 \d+\.\d+
要么是整数使用星号乘以另一个整数,所以 \d+\*\d+
。您希望所有结果都在浮点数列表中,其中小数直接在列表中,对于整数,第二个由第一个重复。
一种方法是:
lines = """
-- Generated ]
FILEUNIT
METRIC /
Hello
-- timestep: Jan 01,2017 00:00:00
3*2 344.0392 343.4564 343.7741
343.9302 343.3884 343.7685 0.0000 341.0843
342.2441 342.5899 343.0728 343.4850 342.8882
342.0056 342.0564 341.9619 341.8840 342.0447 /
"""
nums = []
for n in re.findall(r'(\d+\.\d+|\d+\*\d+)', lines):
split_by_ast = n.split("*")
if len(split_by_ast) == 1:
nums += [float(split_by_ast[0])]
else:
nums += [float(split_by_ast[1])] * int(split_by_ast[0])
print(nums)
哪个returns:
[2.0, 2.0, 2.0, 344.0392, 343.4564, 343.7741, 343.9302, 343.3884, 343.7685, 0.0, 341.0843, 342.2441, 342.5899, 343.0728, 343.485, 342.8882, 342.0056, 342.0564, 341.9619, 341.884, 342.0447]
正则表达式搜索与其中一种格式(十进制或 int*int
)匹配的数字。然后在十进制的情况下,它直接附加到列表中,在 int*int 的情况下,它被解析为一个较小的列表,将第二个 int 重复第一个 int 次,然后将列表连接起来。