【问题标题】:How to print csv rows in ascending order Python如何按升序打印csv行Python
【发布时间】:2016-09-16 06:58:03
【问题描述】:

我正在尝试读取 csv 文件,并且仅当日期在 2010 年 9 月 6 日之前才解析数据并返回行 (start_date)。然后按升序打印行(单词)中的相应值。我可以使用以下方法完成前半部分:

import csv

with open('sample_data.csv', 'rb') as f:

read = csv.reader(f, delimiter =',')

for row in read:

    if row[13] <= '1283774400':
        print(row[13]+"\t \t"+row[16])

它返回正确的 start_date 范围和相应的单词列值,但它们不是按升序返回,如果正确完成会显示一条消息。

我尝试使用 sort() 和 sorted() 函数,在创建一个空列表进行填充然后将其附加到行之后,但我不确定在哪里或如何将其合并到现有代码中,并且非常失败。任何帮助将不胜感激。

【问题讨论】:

  • 你想怎么排序,我的意思是你想要排序的word列值数据?
  • 如果行中的日期小于或等于2010年9月6日,我想从start_date列返回数据。然后从满足条件的words列返回数据。我可以从列中返回正确的行,但无法按升序打印数据。我正在尝试使用 sort() 或 sorted() 打印升序,但它没有打印正确的行或列。

标签: python sorting csv


【解决方案1】:

只需读取列表,根据&lt; date 条件过滤列表并根据第13 行排序为整数

请注意,常见的错误是过滤为 ASCII(这似乎可行),但需要整数转换以避免排序问题。

import csv

with open('sample_data.csv', 'r') as f:
    read = csv.reader(f, delimiter =',')
    # csv has a title, we have to skip it (comment if no title)
    title_row = next(read)
    # read csv and filter out to keep only earlier rows
    lines = filter(lambda row : int(row[13]) < 1283774400,read)

# sort the filtered list according to the 13th row, as numerical
slist = sorted(lines,key=lambda row : int(row[13]))

# print the result, including title line
for row in title_row+slist:
    #print(row[13]+"\t \t"+row[16])
    print(row)

【讨论】:

  • 运行此脚本时收到错误消息。 ValueError:int() 的无效文字,基数为 10:'start_date'。实际的 excel 文件使用 'start_date' 作为列的 id
  • 这就是我评论的重点:像这样跳过标题:title_row = next(read)。已编辑我的帖子,因此将标题行考虑在内。
  • 谢谢。我已经添加了跳过标题的代码,但是我收到另一个错误: Traceback (last 最近调用最后): File "", line 2, in print(row[13]+"\t \t"+row[16]) IndexError: string index out of range ( 我不确定这是缩进问题还是什么,我相信我使用 IDLE 2.7.10 正确缩进
  • 您的代码中可能存在一些太短的行。我刚刚注释掉了你原来的声明,然后打印了整行。由于我没有您的原始文件,我无法自行检查。
猜你喜欢
  • 2023-01-30
  • 2022-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-03
  • 2018-01-19
  • 1970-01-01
  • 2022-01-13
相关资源
最近更新 更多