【问题标题】:Trying to reorganize csv lat lon试图重新组织 csv lat lon
【发布时间】:2021-04-08 01:32:21
【问题描述】:

我正在尝试在导出的 csv 中翻转 lat long,但很难让 python 识别行以重新排序它们。需要以下数据来读取 W#### N#####, W#### N#### 以便在我使用 Linestring() 完成 WKT 的格式化后,QGIS 的 WKT 图层导入将正常工作。

Example Data:
name,start_y,start_x,end_y,end_x
name2: 10,N 42.50105, W 122.87444, N 42.50079, W 122.74144
name3: 11,N 42.49398, W 123.47816, N 42.49453, W 123.29451
name4: 12,N 42.48980, W 123.47812, N 42.49036, W 123.29027
name5: 13,N 42.49403, W 123.20165, N 42.49411, W 123.12354

我尝试使用的代码是:

with open(mycsv.csv', 'r') as infile, open(mycsv.csv', 'a') as outfile:
        # output dict needs a list for new column ordering
        writer = csv.DictWriter(outfile, fieldnames= ['name',  'start_x', 'start_y', 'end_x', 'end_y'], extrasaction='ignore', delimiter = ',')
        # reorder the header first
        writer.writeheader()
        for row in csv.DictReader(infile):
            # writes the reordered rows to the new file
            writer.writerow(row)

当我使用此代码时,csv 保持不变。于是我跑了:

import sys

    f = open(sys.argv[0],'r')
    reader = csv.reader(f,delimiter=",")
    num_cols = len(next(reader)) # Read first line and count columns
    print(num_cols)

它告诉我它只计算 1 列,因此第一个公式不起作用是有道理的,因为它不是在单独的列中读取 csv,而是在一行中读取。我错过了什么? Python 3.9 是我正在使用的。提前致谢!

ps,这是我的第一个 python 程序,我没有接受过正规的编码教育,所以请原谅任何新手错误

【问题讨论】:

  • 您的 csv 有 5 个标题,但数据中只有 3 列,但您说它只计算了一列,因此请确保您向我们提供了输入的 exact 内容文件。
  • 抱歉,我提供的示例数据集中缺少一些“,”。这就是数据在 python 中的显示方式。标题应该与我现在理解的列相匹配。
  • 最好不要手动输入您的测试输入和代码,而是剪切并粘贴您的确切数据/代码来重现您的问题。例如,缩进错误,代码中缺少单引号。

标签: python csv


【解决方案1】:

给定input.csv

name,start_y,start_x,end_y,end_x
name2: 10,N 42.50105, W 122.87444, N 42.50079, W 122.74144
name3: 11,N 42.49398, W 123.47816, N 42.49453, W 123.29451
name4: 12,N 42.48980, W 123.47812, N 42.49036, W 123.29027
name5: 13,N 42.49403, W 123.20165, N 42.49411, W 123.12354

您的代码基本上可以工作。不过,我删除了一些不需要的额外参数,使用'w' 进行写入,并按照csv 模块文档的要求添加了newline='',但请确保不要读/写同一个文件。

import csv

with open('input.csv', 'r', newline='') as infile, open('output.csv', 'w', newline='') as outfile:
    writer = csv.DictWriter(outfile, fieldnames= ['name', 'start_x', 'start_y', 'end_x', 'end_y'])
    writer.writeheader()
    for row in csv.DictReader(infile):
        writer.writerow(row)

输出.csv:

name,start_x,start_y,end_x,end_y
name2: 10, W 122.87444,N 42.50105, W 122.74144, N 42.50079
name3: 11, W 123.47816,N 42.49398, W 123.29451, N 42.49453
name4: 12, W 123.47812,N 42.48980, W 123.29027, N 42.49036
name5: 13, W 123.20165,N 42.49403, W 123.12354, N 42.49411

如果您确实想要重写原始文件,那么您必须将所有行读入内存,然后将它们写回,但这样做是有风险的,直到您确保代码正确。

import csv

with open('mycsv.csv', 'r', newline='') as infile:
    rows = list(csv.DictReader(infile))

with open('mycsv.csv', 'w', newline='') as outfile:
    writer = csv.DictWriter(outfile, fieldnames= ['name', 'start_x', 'start_y', 'end_x', 'end_y'])
    writer.writeheader()
    writer.writerows(rows) # note plural writerows to re-write all data

【讨论】:

  • newline = '' 和 "rows" 似乎是我所缺少的。这现在很完美。谢谢!
【解决方案2】:

您的代码按照为我编写的方式运行(一旦我更正了引号)。但请注意,您正在为输出(以附加模式)和输入打开相同的文件。两次打开同一个文件通常是一个坏主意,在不同的系统上可能会有所不同,但在这种情况下它对我有用;新数据附加到文件末尾。也许它在您的系统上没有以这种方式工作,或者文件开头保持不变的事实可能是您认为它不起作用的原因?您可能希望将重新排序的行写入不同的文件。

您的示例数据代码导致mycsv.csv 如下所示:

name,start_y,start_x,end_y,end_x
name2: 10,N 42.50105, W 122.87444, N 42.50079, W 122.74144
name3: 11,N 42.49398, W 123.47816, N 42.49453, W 123.29451
name4: 12,N 42.48980, W 123.47812, N 42.49036, W 123.29027
name5: 13,N 42.49403, W 123.20165, N 42.49411, W 123.12354
name,start_x,start_y,end_x,end_y
name2: 10, W 122.87444,N 42.50105, W 122.74144, N 42.50079
name3: 11, W 123.47816,N 42.49398, W 123.29451, N 42.49453
name4: 12, W 123.47812,N 42.48980, W 123.29027, N 42.49036
name5: 13, W 123.20165,N 42.49403, W 123.12354, N 42.49411

【讨论】:

  • 附加也是一个很好的问题,我一解决第一个问题就会遇到。我从来没有做到这一点,但也感谢您花时间指出这一点!
猜你喜欢
  • 1970-01-01
  • 2018-09-05
  • 2012-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-15
相关资源
最近更新 更多