【问题标题】:Sorting by column in a CSV and writing to a new CSV file in Python按 CSV 中的列排序并在 Python 中写入新的 CSV 文件
【发布时间】:2022-01-07 18:31:59
【问题描述】:

我的代码:

import csv
import operator


first_csv_file = open('/Users/jawadmrahman/Downloads/account-cleanup-3 array/example.csv', 'r+')
csv_sort = csv.reader(first_csv_file, delimiter=',')
sort = sorted(csv_sort, key=operator.itemgetter(0))
sorted_csv_file = open('new_sorted2.csv', 'w+', newline='')
write = csv.writer(sorted_csv_file)
for eachline in sort:
    print (eachline)
    write.writerows(eachline)

我有一个示例 csv 文件:

我想按第一列排序并以这种方式获得结果: 1,9 2,17, 3,4 7,10 使用上面发布的代码,这就是我现在得到它的方式:

我该如何解决这个问题?

【问题讨论】:

  • , 在这种情况下是否应该代表小数点?
  • pandas 包是用于处理表格数据(例如 CSV)的最全面且受支持的包。在 Pandas 中读取、排序和保存应该是大约 3 行代码。见stackoverflow.com/questions/37787698/…stackoverflow.com/questions/14365542/…
  • eachline 本身就是一个列表,因此write.writerows(eachline) 为每个eachline 生成两行。试试write.writerow(eachline)。当您使用它时,我鼓励您查看与 open() 一起使用的 with 关键字为您做了什么。它将大大清理您的代码。
  • 请不要包含数据图像。请编辑您的问题并包含您的输入 CSV 和所需的输出 CSV 作为文本
  • @JonSG,谢谢!

标签: python csv file


【解决方案1】:

正如 JonSG 在 cmets 中对您的原始帖子指出的那样,您在一行中调用 writerows()(复数)eachline

将最后一行更改为write.writerow(eachline),这样就可以了。

深入研究问题

writerows() 需要“值列表的列表”。外部列表包含行,每行的内部列表实际上是单元格(该行的列):

sort = [
  ['1', '9'],
  ['2', '17'],
  ['3', '4'],
  ['7', '10'],
]

writer.writerows(sort)

将生成具有您期望的两列和四行的已排序 CSV(并且您的打印语句会显示)。

当您使用单行调用 writerows() 时:

for eachline in sort:
    writer.writerows(eachline)

你会得到一些非常奇怪的输出:

  • 它在包含许多行的外部列表中解释eachline,这意味着......

  • 它将eachline 中的每个项目解释为具有单独列的行...

  • eachline 中的每个项目都是 Python 序列 字符串,因此 writerows() 会遍历字符串中的每个字符,将每个字符视为自己的列...

    ['1','9'] 被视为两个单列行,['1']['9']

    1
    9
    

    ['2', '17'] 被视为单列行['2'] 和双列行['1', '7']

    2
    1,7
    

【讨论】:

  • 啊,我明白了。这行得通,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-04
  • 2018-11-19
  • 1970-01-01
  • 1970-01-01
  • 2018-09-22
  • 2016-01-05
  • 2018-02-12
相关资源
最近更新 更多