Python 删除特定属性小于或等于0的行
我有几个30多行大于1GB的大型文本文件,在拆分see和for背景后,这些文件正在ArcGIS中处理 即使在分割之后,该过程也需要3天,因此我想删除Rx值小于或等于0的所有xy点 我没有python来读取超过500Mb的txt数据集,所以我使用cygwin/SED命令对数据进行初始清理,然后使用python对文件进行分块。因此,理想情况下,该过程将是向python添加一些代码,如下所示,以避免将Rx0的所有行写入新的文本文件。我还想删除“最佳单位”列Python 删除特定属性小于或等于0的行,python,regex,arcgis,Python,Regex,Arcgis,我有几个30多行大于1GB的大型文本文件,在拆分see和for背景后,这些文件正在ArcGIS中处理 即使在分割之后,该过程也需要3天,因此我想删除Rx值小于或等于0的所有xy点 我没有python来读取超过500Mb的txt数据集,所以我使用cygwin/SED命令对数据进行初始清理,然后使用python对文件进行分块。因此,理想情况下,该过程将是向python添加一些代码,如下所示,以避免将Rx0的所有行写入新的文本文件。我还想删除“最佳单位”列 from itertools import
from itertools import islice
import arcpy, os
#fc = arcpy.GetParameter(0)
#chunk_size = arcpy.GetParameter(1) # number of records in each dataset
fc='cb_vhn007_5.txt'
Name = fc[:fc.rfind('.')]
fl = Name+'.txt'
headers_count = 1
chunk_size = 500000
with open(fl) as fin:
headers = list(islice(fin, headers_count))
part = 1
while True:
line_iter = islice(fin, chunk_size)
try:
first_line = line_iter.next()
except StopIteration:
break
with open(Name+'_%d.txt' % part, 'w') as fout:
for line in headers:
fout.write(line)
fout.write(first_line)
for line in line_iter:
## add something here to check if value after third tab
## is >0 and if so then write the row or skip.
fout.write(line)
print "Created part %d" % part
part += 1
新代码-第一行包括-Rx值
from itertools import islice
import arcpy, os
#fc = arcpy.GetParameter(0)
#chunk_size = arcpy.GetParameter(1) # number of records in each dataset
fc='cb_vhn007_5.txt'
Name = fc[:fc.rfind('.')]
fl = Name+'.txt'
headers_count = 1
chunk_size = 500000
with open(fl) as fin:
headers = list(islice(fin, headers_count))
part = 1
while True:
line_iter = islice(fin, chunk_size)
try:
first_line = line_iter.next()
except StopIteration:
break
with open(Name+'_%d.txt' % part, 'w') as fout:
for line in headers:
fout.write(line)
fout.write(first_line)
for line in line_iter:
if line.split()[2][0:1] != '-':
#print line.split()[2]
fout.write(line)
print "Created part %d" % part
part += 1
可能只是在检查线路[24]!='-'应该足够了
即替换:
fout.write(line)
与
可能只是在检查线路[24]!='-'应该足够了
即替换:
fout.write(line)
与
您要查找的线路如下所示:
if line.split()[2][0:1] != "-"
fout.write(line)
这将拆分输入,查看第三个条目,查看第一个字符,如果行是-,则跳过打印。要查找的行如下所示:
if line.split()[2][0:1] != "-"
fout.write(line)
这将拆分输入,查看第三个条目,查看第一个字符,如果行是-,则跳过打印。您可以使用line.split将行拆分为包含4列中每个列的值的列表
例如:
line='-16.37617\t144.70329\t017.2\t7'
line.split()
# ['-16.37617', '144.70329', '017.2', '7']
然后您可以强制第[2]行记住python是基于0的索引,并检查它是否大于0:
if float(line.split()[2]) > 0:
fout.write(line)
或者你可以检查它是否有负号:
if line.split()[2].find('-') != -1:
fout.write(line)
如果每个文本文件的列顺序可能不同,则可以对标题执行拆分,确定哪个是Rx,并使用它而不是2:
i = headers.split().index('Rx')
# now use line[i]
可以使用line.split将行拆分为一个列表,其中包含4列中每列的值
例如:
line='-16.37617\t144.70329\t017.2\t7'
line.split()
# ['-16.37617', '144.70329', '017.2', '7']
然后您可以强制第[2]行记住python是基于0的索引,并检查它是否大于0:
if float(line.split()[2]) > 0:
fout.write(line)
或者你可以检查它是否有负号:
if line.split()[2].find('-') != -1:
fout.write(line)
如果每个文本文件的列顺序可能不同,则可以对标题执行拆分,确定哪个是Rx,并使用它而不是2:
i = headers.split().index('Rx')
# now use line[i]
我知道它不是python,但它可能是这项工作的正确工具:
cat cb_vhn007_5.txt | awk '($3 > 0) {print $0}' > parsedfile
我知道它不是python,但它可能是这项工作的正确工具:
cat cb_vhn007_5.txt | awk '($3 > 0) {print $0}' > parsedfile
下面是一个python脚本,它将读取一个文件,其中包含格式化为每行四个空格分隔的字段的数据,检查第三个字段,并输出第三个字段为正浮点数的任何行 在Python2.7.2上进行测试
import re
in_fh = open ("gis.txt","r")
out_fh = open ("outfile.txt","w")
for row in in_fh:
row = re.sub(' +',',',row) # convert to comma-separated format
try:
latitude, longitude, rx, best_unit = row.split(',')
except ValueError: # row didn't have four fields
print ("complain - not four fields")
continue
try:
float_rx = float(rx)
except ValueError: # rx could not be cast to float
print ("complain - third field not float")
continue
if float_rx > 0:
out_fh.write(latitude + "," + longitude + "," + rx + "\n")
else:
pass # discard the row
in_fh.close()
out_fh.close()
一次只处理一行,所以无论输入和输出文件的大小,内存使用量都应该保持不变
或者,您是否考虑过使用数据库?sqlite3是内置的,可能可以处理1Gb的数据。然后,您可以通过执行SELECT*FROM data(其中rx>0)来获得此结果。下面是一个python脚本,它将读取一个文件,其中包含格式为每行四个空格分隔字段的数据,检查第三个字段,并输出第三个字段为正浮点数的任何行 在Python2.7.2上进行测试
import re
in_fh = open ("gis.txt","r")
out_fh = open ("outfile.txt","w")
for row in in_fh:
row = re.sub(' +',',',row) # convert to comma-separated format
try:
latitude, longitude, rx, best_unit = row.split(',')
except ValueError: # row didn't have four fields
print ("complain - not four fields")
continue
try:
float_rx = float(rx)
except ValueError: # rx could not be cast to float
print ("complain - third field not float")
continue
if float_rx > 0:
out_fh.write(latitude + "," + longitude + "," + rx + "\n")
else:
pass # discard the row
in_fh.close()
out_fh.close()
一次只处理一行,所以无论输入和输出文件的大小,内存使用量都应该保持不变
或者,您是否考虑过使用数据库?sqlite3是内置的,可能可以处理1Gb的数据。然后,您可以通过从rx>0的数据中执行SELECT*来获得此结果。您可能希望在多核机器上使用多个线程,并且使用一种没有GIL的语言来执行此操作。如何?用什么?因为python是逐行读/写的,所以这不是问题所在;不应该这样做,因为你没有利用你拥有的资源。这类东西特别有趣。这将使执行时间大大加快。我很难想象你处理一个千兆字节的数据需要三天的时间。我没有仔细研究你之前的问题,我有一种隐秘的怀疑,你只是用它来为你编写整个应用程序——但是只遍历3000万条纯文本不会太可怕。你确定你的应用程序不需要从头开始重新设计吗?谢谢你的链接…我需要研究一下,但这是一个长期的解决方案,对于如此大的数据集,我将不得不投资学习postgis/postgres,而不是arcgis。现在我能在python中实现同样的功能吗?可能使用find\t,但如何获取第二个选项卡?您可能希望在多核计算机上使用多个线程,并使用没有GIL的语言来执行此操作。如何?用什么?因为python是逐行读/写的,所以这不是问题所在;不应该这样做,因为你不是
Don’不要利用你拥有的资源。这类东西特别有趣。这将使执行时间大大加快。我很难想象你处理一个千兆字节的数据需要三天的时间。我没有仔细研究你之前的问题,我有一种隐秘的怀疑,你只是用它来为你编写整个应用程序——但是只遍历3000万条纯文本不会太可怕。你确定你的应用程序不需要从头开始重新设计吗?谢谢你的链接…我需要研究一下,但这是一个长期的解决方案,对于如此大的数据集,我将不得不投资学习postgis/postgres,而不是arcgis。现在我能在python中实现同样的功能吗?可能使用find\t,但如何获得第二个选项卡?索引“Rx”的触感特别好。@mathematic.coffee这看起来是一个很好的解决方案,但它只包括detaset的所有行。我尝试了以下方法;check=line.split[2][0:1],如果floatcheck我不知道[0:1]是从哪里来的,那么floatline.split[2]>0就是fine抱歉,这是我的错误…第一个区块中包含负Rx值记录的第一行的问题仍然存在。最后一行也只有'-1'。这让我担心,因为其他不太明显的问题可能正在发生。看起来这是因为你的第一条线=第二条线。下一条-你在为第二条线做之前就放弃了它,这不是从一开始就开始的,但是从第二行来看,它现在达到了。索引'Rx'是一个特别好的触感。@mathematic.coffee这看起来是一个很好的解决方案,但它只包括detaset的所有行。我尝试了以下方法;check=line.split[2][0:1],如果floatcheck我不知道[0:1]是从哪里来的,那么floatline.split[2]>0就是fine抱歉,这是我的错误…第一个区块中包含负Rx值记录的第一行的问题仍然存在。最后一行也只有'-1'。其他不太明显的问题可能会发生,这让我很担心。看起来这是因为你的第一行=第二行。下一步-你在对第二行进行处理之前就放弃了它,这不是从一开始就开始的,而是从第二行开始的。第二行目前达到+1-对于文件格式的变化来说很脆弱,但这是最简单的解决方案。问题:…不包括Rx+1的所有行-关于文件格式的变化,这是最简单的解决方案。问题:…不包括RxTanks的所有行。第一次尝试似乎有效,但它将第一行插入标题的同一行。你是什么意思?我在回答之前试过了,一切看起来都很好。再次检查。当我运行命令时,输出文件的标题和第一行数据位于顶行。谢谢。第一次尝试似乎有效,但它将第一行插入标题的同一行。你是什么意思?我在回答之前试过了,一切看起来都很好。我再次检查了它。当我运行命令时,输出文件的标题和第一行数据位于顶行。第一次查看时效果很好,但一些块的第一行包含包含负Rx值的行。任何想法。有问题的代码已更新。这取决于有问题的数据。请注意,我的答案也失败了。yup-@mathematic.coffee答案在理论上解决了这个问题,但当我运行它时,所有的值都包括在内。它似乎将输出视为文本,而不是浮点…在第一次查看时效果很好,但是一些块的第一行包含包含负Rx值的行。任何想法。有问题的代码已更新。这取决于有问题的数据。请注意,我的答案也失败了。yup-@mathematic.coffee答案在理论上解决了这个问题,但当我运行它时,所有的值都包括在内。它似乎将输出视为文本而不是浮动…谢谢。是的,最好在db-postgres/postgis中这样做,但我现在没有时间学习。谢谢。是的,最好在db-postgres/postgis中这样做,但我现在没有时间学习。