我试图使用Python自动化无聊的东西。它几乎已经完成,但是列表中的字符串存在问题。
我从.txt文件中逐行收集一些数据,我把它放在一个列表中,然后我更改了一些需要更改的字符串。
问题是我列表中字符串的长度似乎受前一个字符串的长度限制(在我的情况下,文本中的字符串)。
要恢复,例如len(data[0]) = 5
。如果我试图输入一个包含6个字符或更多字符的字符串,它将会被删除。
我该如何处理?一个想法?
感谢。
已编辑:
def dxf_copy_lines(f):
text = f.readlines()
i = 0
lines_copied = []
lines_to_delete = set(())
while text[i] != 'TEXT\n':
i = i + 1
j = i
while text[j] != 'VIEWPORT\n':
lines_copied = np.append(lines_copied, text[j])
j = j + 1
print(lines_copied)
return lines_copied
def modify_lines(lines_copied, ref_dim, id_f,num):
n = len(lines_copied)
for i in range(n):
print (lines_copied[i][0:5])
if lines_copied[i][0:5] == 'nazwa':
lines_copied[i] = ref_dim.rstrip() + ' Pos. '+ id_f.rstrip()
if lines_copied[i][0:3] == 'szt':
lines_copied[i] = 'szt: ' + num +'\n'
print(lines_copied)
return lines_copied
答案 0 :(得分:1)
问题是您使用的是numpy
数组。这肯定是不 numpy
数组的用例。考虑:
>>> import numpy as np
>>> lines = []
>>> text = ['abc','de','fghk','lmnop','qrs']
>>> for line in text:
... lines = np.append(lines, line)
...
>>> lines
array(['abc', 'de', 'fghk', 'lmnop', 'qrs'],
dtype='<U32')
因此lines
是numpy.ndarray
的{{1}}。数组元素假设为固定大小。这是允许dtype='<U32'
进行快速数值计算的原因。所以,numpy
意味着你的数组是32的unicode字符串。考虑如果我尝试用大于32的字符串更改数组的元素会发生什么:
dtype='<U32'
被截断了!
>>> lines[2] = "this is an extremely, very very very, long long long, line"
>>> lines
array(['abc', 'de', 'this is an extremely, very very ', 'lmnop', 'qrs'],
dtype='<U32')
希望现在这很有道理。
这实际上不是>>> len('this is an extremely, very very ')
32
的用例,它实际上更慢。以下操作:
numpy
是O(N)。由于您是在循环中进行的,因此它会按比例缩放。另一方面,python列表可以使用lines_copied = np.append(lines_copied, text[j])
,这将是一个恒定的时间操作!