【问题标题】:Splice Two Lists and Output to CSV拼接两个列表并输出到 CSV
【发布时间】:2014-04-25 20:09:30
【问题描述】:

我有两个列表,分别包含纬度和经度坐标。我希望能够以以下格式将这些列表写入 csv 文件:

Data1, Data2, Data3, lat1, long1, lat2, long2,…,latn, longn

其中 Data1、Data2、Data3 是我需要在同一行上的其他数据,后跟“拼接”格式的纬度和经度。

我已经能够使用以下方法生成一个“拼接”的纬度和经度字符串:

",".join("%s,%s" % t for t in zip(lat, long))

但是,当我将此字符串输入csv.writer.writerow() 时,当我打开 csv 文件时,它会被 csv-reading-software (Excel) 解释为单个元素。

有哪些代码段可以帮助我达到我想要的结果?

【问题讨论】:

  • 向我们展示输入、当前输出和预期输出。 Excel 和 Libreoffice 都允许您在导入时指定数据分隔符,因此请确保将其设置为逗号。

标签: python csv


【解决方案1】:

这应该将所有坐标写在一行中。你想要的其余部分有点不清楚,可能有更好的方法来做到这一点,但如果没有更多关于你的输入和所需输出的知识,就无法猜测。

from itertools import chain

writer.writerows([data1, data2, data3] + list(chain.from_iterable(zip(lat, lon))) )

【讨论】:

  • 感谢您的帮助。这个片段做了我希望它会做的事!能否麻烦您解释一下代码的 list(chain.from_iterable(zip(lat, lon))) 是如何工作的? zip 对象是可迭代的,所以 chain.from_iterable 将 zip 的每个“行”链接在一起?我接近了吗?
  • 是的,itertools.chain.from_iterable 将序列“扁平化”一层。有关详细信息,请参阅 [docs[(docs.python.org/2/library/itertools.html#itertool-functions)。 itertools 很实用的模块,看看吧。
【解决方案2】:

你走在正确的道路上。然而,一个小细节 - 不是总是这样吗? writerow 默认将可迭代对象作为参数,即列表、元组等。在这种情况下,列表/可迭代对象中的每个元素将是 Excel 中的单个单元格。要查看差异,请尝试以下操作:

import csv
writer = csv.writer( some_file_handle )
coordinates_iter = zip( lat, long )
# Will write lat and long as you expect
for latlong_tuple in coordinates_iter:
    writer.writerow( latlong_tuple )

如果您将连接的纬度和经度作为字符串输入writerow 而不是列表/可迭代,则它将信息写入单个单元格中。像这样

coordinates_str = ",".join( "%s,%s" % t for t in zip( lat, long ) )
# Will write lat and long as a string in a single cell
for latlong_str in coordinates_str:
    writer.writerow( latlong_str )

下面的@m.wasowski 建议使用pythonic 方法来“链接”您的列表并改用writerows。我推荐它。但是,如果您更喜欢保留嵌套循环方法,则可以使用以下方法:

for row in izip( Data1, Data2, Data3, lat1, long1, lat2, long2, … ,latn, longn ):
    writer.writerow( row )

希望对你有帮助。

【讨论】:

  • 感谢您的解释,这确实让我对 zip 的工作原理有了一些很好的了解。虽然我承认我的要求并不那么明确,但我需要的是能够将连接的纬度/经度与数据(我任意称为 Data1、Data2 等)全部连接到 csv 文件的一行上。跨度>
猜你喜欢
  • 2021-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-28
  • 2021-03-05
  • 2021-03-03
  • 1970-01-01
相关资源
最近更新 更多