Python不在大文件上应用正则表达式
下面是我试图在完整文件上应用正则表达式的代码。每当我在小于1MB的较小文件上测试此代码时 代码工作正常,但在大文件上它不工作,并返回空数组。下面是我试图解析的数据示例。 通常,它包含300万行这样的数据Python不在大文件上应用正则表达式,python,regex,mmap,finite-element-analysis,Python,Regex,Mmap,Finite Element Analysis,下面是我试图在完整文件上应用正则表达式的代码。每当我在小于1MB的较小文件上测试此代码时 代码工作正常,但在大文件上它不工作,并返回空数组。下面是我试图解析的数据示例。 通常,它包含300万行这样的数据 import re import sys, getopt import mmap shakes = open(sys.argv[1:][0],'r') love = open(sys.argv[1:][1], "w") #moreLove = open (sys.argv[1:][2], "w
import re
import sys, getopt
import mmap
shakes = open(sys.argv[1:][0],'r')
love = open(sys.argv[1:][1], "w")
#moreLove = open (sys.argv[1:][2], "w")
#HardLove = open (sys.argv[1:][3], "w")
node = re.compile('\*NODE[a-zA-Z, \r\n\t0-9\.-]+')
element3 = '\*ELEMENT, TYPE=S3RS[a-zA-Z, \r\n\t0-9\.=;_-]+'
element4 = '\*ELEMENT, TYPE=S4RS[a-zA-Z, \r\n\t0-9\.=;_-]+'
m = mmap.mmap(shakes.fileno(), 0, access=mmap.ACCESS_READ)
line = node.findall(m.read().decode('utf-8'))
#for item in line:
# love.write(item)
#print(m.read())
print(line)
我觉得你太花哨了。不需要将整个文件读入内存。只需打开文件并逐行迭代(对于f中的行)。您的示例只有
*节点
,但您试图将*节点
匹配为区分大小写的。此外,您从未使用元素3
或元素4
,它们应该做些什么吗?我正在使用它们,但它们只是代码的下一步@JonathonReinhart我不能逐行迭代,因为F.E模型文件中有不同的块,必须立即搜索,而不是逐行搜索。作为旁注,mmap()ping一个文件,然后将其全部读取到物理内存中是毫无意义的。您应该改为将数据读入内存阵列中–300万行(每个行有4个数字)将使用大约50MB的内存。
*Assembly, name=Assembly
**
*Instance, name=vessel-1, part=vessel_bot
*Node
1, 24.8572464, 213.8125, 53.1415176
2, 41.4983292, 213.8125, 41.4983292
3, 44.4593391, 213.8125, 44.4593391
4, 28.0079861, 213.8125, 56.2922592
5, 24.8572464, 233.8125, 53.1415176
6, 28.0079861, 233.8125, 56.2922592
7, 48.2778168, 233.8125, 61.0057411
8, 46.156498, 233.8125, 61.0057411
9, 53.5811195, 223.3125, 53.5811195
10, 54.641777, 224.8125, 54.641777
11, 49.6920319, 233.8125, 62.4199524
12, 56.0559921, 224.8125, 56.0559921
13, 50.7526894, 233.8125, 61.3592911
14, 56.0559921, 226.3125, 56.0559921
15, 41.4983292, 226.3125, 41.4983292
16, 35.8528366, 233.8125, 46.4594383
17, 37.5893517, 233.8125, 52.4385948
18, 45.8735542, 223.3125, 45.8735542
19, 44.4593391, 221.3125, 44.4593391
20, 35.0599136, 233.8125, 52.1926079
21, 34.0794373, 233.8125, 44.686039
22, 31.5089321, 233.8125, 44.4683838
23, 38.5373192, 243.3125, 38.5373192