使用Python按经度和纬度排序csv数据

使用Python按经度和纬度排序csv数据,python,csv,Python,Csv,我试图在一个连接的、格式化的csv文件中对纬度和经度数据进行排序,但未成功。我一直在尝试编辑stackoverflow语法示例(希望语法错误不会再次出现),但现在不断出现TypeError…参数1必须有“write”方法,我不完全理解 我尝试了几次编辑和两个不同的代码。我正在使用python 2.7.13。我特别想 1) 打开连接的“组合”csv 2) 按从西到东的横向/纵向数据排序 3) 关闭同一个文件。(我不希望创建新文件) 然后,此csv将用于创建形状文件 在这方面我是个新手,不能100%

我试图在一个连接的、格式化的csv文件中对纬度和经度数据进行排序,但未成功。我一直在尝试编辑stackoverflow语法示例(希望语法错误不会再次出现),但现在不断出现TypeError…参数1必须有“write”方法,我不完全理解

我尝试了几次编辑和两个不同的代码。我正在使用python 2.7.13。我特别想 1) 打开连接的“组合”csv 2) 按从西到东的横向/纵向数据排序 3) 关闭同一个文件。(我不希望创建新文件)

然后,此csv将用于创建形状文件

在这方面我是个新手,不能100%确定我是应该在concatenate_csvs部分还是新的sort_数据部分这样做。我甚至不知道write方法是什么……谷歌让我引用信息。文档并没有真正说明这一点……所以,我很困惑

非常需要并感谢反馈!我花了整整8个小时做这个:(:)

请看一下我的语法是否正确,因为我以前遇到过一大堆这样的错误

当然……我已经查过文件了

with open(combined, 'r+') as combined:

    header = reader.next()

    for val in combined:
        long = val[3]
        lat = val[4]

        long = sorted(coords, key = lambda x: x[3])
        lat = sorted(coords, key = lambda x: x[4])

        writer.writerow(combined, 'wb')
我也试过这个代码

for root, sub, files in os.walk(csv_dir):
    filenames = [os.path.join(root, filename) for filename in files
                if filename.endswith('intermediate.csv')]
    combined_path = os.path.join(root, 'combined.csv')
    with open(combined_path, 'w+') as combined:#orig

        writer = csv.writer(combined)#orig
        writer.writerow(header)#orig
        #new
        #for val in combined: 
            #val[3] = sorted(val[3], key=lambda x: x[3])
            #val[3] = val[3].sorted(key=lambda x: x[3])
        #NOTE - both of the above syntax generated the same error...assuming the syntax is synonymous. Still identifies as string data.

        write_files(filenames, combined)#orig

您的尝试充满了概念错误。要打开一个csv文件并根据2个值对行进行排序(按数字排序需要
float
转换)并将其写回(带标题),我将执行以下操作:

import csv,shutil

with open(combined, 'r') as fr, open(combined+".temp",'w',newline="") as fw:  # python 2: open(combined+".temp",'wb')
    reader = csv.reader(fr)
    writer = csv.writer(fw)
    header = reader.next()
    # write back the header or it's lost
    writer.writerow(header)
    # write the rest as sorted list of rows
    writer.writerows(sorted(list(reader), key=lambda x : (float(x[3]),float(x[4]))))
shutil.move(combined+".temp",combined)
注:

  • lambda key函数获取一行并提取字段3和4(lat和long),生成一个组合键,将所有纬度放在第一位,并在经度上使用tiebreaker

  • 排序
    reader
    会使用它,但强制输入为行列表会更快,因为排序
    无论如何都会这样做

  • 无法以读/写方式打开文本文件。首先读取文本文件,然后将其写入另一个文件,如果一切正常,则向后移动,如上图所示,使用
    shutil
    执行移动(由于使用了相同的文件系统,因此在此处为重命名)

在读取文件时,不要试图写入文件。这肯定会把它搞砸。如果数据不是那么大,并且不适合内存,则应该加载数据,然后在内存中对其进行排序。但要对值进行排序,需要先将其转换为数字。 我认为最快的方法就是使用熊猫。如下图所示:

import pandas   

your_separator=','
df= pd.read_csv(file, dtype='str', sep=your_separator) # 1
df['sort_lat']=df[lat_col].astype('float64')   # 2
df['sort_long']=df[long_col].astype('float64') 

df.sort_values(['sort_lat', 'sort_long'], ascending=True, inplace=True) # 3
df.drop(['sort_lat', 'sort_long'], axis='columns', inplace=True) # 4
df.to_csv(file, sep=your_separator)
1) 将文件读入所谓的pandas数据帧。参数dtype告诉pandas,它应该将所有字段解释为字符串,而不是执行自动类型转换(只是为了确保在类型转换过程中不会因舍入问题而无意识地更改数据)

2) 使用longtude和latticude的二进制形式在数据帧中创建两个新列。您只需要用原始csv中两个字段的实际名称替换lat_col和long_col

3) 按这两个字段对数据帧进行排序,并将现有数据帧(就地)重用到安全内存中

4) 删除我们创建的两个辅助列,这样我们就可以保存它,而不需要它们


好吧,我知道,也许你不喜欢在你的解决方案中引入另一个库的想法,但是pandas对于这类东西来说真的很棒,你甚至可以用它来查询或聚合数据,这种方式通常只能在数据库中实现。因此,您以后可能需要它。

如果您收到当前代码中的错误消息,请提供完整的错误回溯以及用于编辑的示例输入和输出-我必须切断一些代码,因为So不允许我发布声明我的代码段中存在格式错误。我得到了一个参数1必须有一个“write”方法。我已经添加了报价信息…编辑-我不得不删除一些代码,因为SO不允许我发布声明我的代码片段中存在格式错误。(一旦我丢失了它发布的def语句。)我在下面的行writer=csv.writer(组合,quoting=csv.quote_NONE)中添加了引号信息,这就是错误-TypeError:参数1必须有一个“write”方法。我想你必须先将long/lat的列值转换为数字类型,然后才能对它们进行安全排序,否则我猜它们会被比较成字符串,结果200大于1000。哦,当然。那是个愚蠢的错误!!谢谢,修好了。我太想使用切片了,以至于忘了这一点。非常感谢你的解释——这很有意义,也很有帮助。不幸的是,我正在使用上面的you's代码,现在得到一个新错误:TypeError:“newline”是此函数的无效关键字参数。有什么想法吗?@ C.Poier-ScTa:也许你应该考虑切换到Python 3,因为很多库将很快停止支持Python 2。在Python 3上达成协议,但目前它不在我的控制范围内:(这段代码已经消除了‘新行’(可能是第三件事)。我也将在将来了解更多关于切片的内容。谢谢大家!