Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 删除特定属性小于或等于0的行_Python_Regex_Arcgis - Fatal编程技术网

Python 删除特定属性小于或等于0的行

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

我有几个30多行大于1GB的大型文本文件,在拆分see和for背景后,这些文件正在ArcGIS中处理

即使在分割之后,该过程也需要3天,因此我想删除Rx值小于或等于0的所有xy点

我没有python来读取超过500Mb的txt数据集,所以我使用cygwin/SED命令对数据进行初始清理,然后使用python对文件进行分块。因此,理想情况下,该过程将是向python添加一些代码,如下所示,以避免将Rx0的所有行写入新的文本文件。我还想删除“最佳单位”列

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中这样做,但我现在没有时间学习。