【问题标题】:Printing only certain rows in a .csv file仅打印 .csv 文件中的某些行
【发布时间】:2013-02-12 15:05:02
【问题描述】:

我有一个 .csv 文件,其中包含与此类似的出生日期字段:

John,Smith,34 La La Lane,14/03/85,johnsmith@email.com
Sarah,Second,42 Wallaby Way,11/06/92,sarahsecond@email.com
Third,Example,99 Peacock Terrace,04/12/89,thirdexample@email.com

我想制作一个程序,只打印在某个月份出生的条目文件中的行(在这种情况下,月份是在第一个斜线之后,即 dd/mm/yy)。

因此,如果所需月份是 3 月,它将打印出 John Smith 的条目。

对此的任何帮助都会很棒,我已经挣扎了一段时间

【问题讨论】:

  • 请编辑您的帖子以包含您对解决方案的尝试。谢谢。

标签: python csv


【解决方案1】:

我不确定您遇到的问题的哪一部分,所以我将给出一个比较笼统的答案。 Python 有一个 csv 阅读器,你可以像这样使用:

import csv
desiredMonth = 3
with open('people.csv', 'rb') as csvfile:
    content = csv.reader(csvfile, delimiter=',')
    for row in content:
        month = int(row[3].split('/')[1])
        if month == desiredMonth:
            # print the row or store it in a list for later printing

row 已经为您分离到一个列表中,所以row[3] 将是生日。 split() 然后将月份部分分成几部分,[1] 给出第二部分,即月份。将其转换为 int 是个好主意,这样您就可以轻松地将其与您想要的任何月份进行比较。

【讨论】:

  • 我的主要问题是关于拆分月份。您能否进一步解释这部分代码?感谢您迄今为止的帮助!
  • 已编辑以提供更多详细信息
  • 完美!非常感谢:)
  • 对于稍微复杂一点的过滤器,您可能希望使用datetime 将日期解析为对象……但对于这种情况,split 很好。
【解决方案2】:
import csv
with open('yourfile.csv', 'rb') as csvfile:
    spamreader = csv.reader(csvfile, delimiter=',')
    for row in spamreader:
        date = row[3]
        month = date.split('/')[1]
        if int(month) >= YOUR_MONTH_HERE
            print row

【讨论】:

  • 缺少分号。
【解决方案3】:

尽可能多的教程类型:-)

somecsvfile=r'/home/me/Desktop/txt.csv'
the_month_you_are_looking_for = 6 # as in june.
with open(somecsvfile, 'r') as fi:
    for line in fi:   
        list_from_text = line.split(',')
        bday = list_from_text[3]
        bmonth = int(bday.split('/')[1])
        if bmonth == the_month_you_are_looking_for:
            print (line)

【讨论】:

  • 除了一堆错误(例如,for line in fi.readlines(): 而不是 for line in fi:,打开文件 'r' 而不是 'rb' 等)之外,这不会在 goron 的答案上添加任何内容并尝试进行手动 CSV 解析,而不是使用 csv
【解决方案4】:

这是一种不同的方法...对于处理 csv 文件,python 包 csvkit 安装了许多命令行实用程序,让您可以非常轻松地对 .csv 文件进行切片和切块。

$ pip install csvkit

这将安装一个名为csvgrep(以及其他)的命令。

$ csvgrep -c 4 -r '\d{2}/03' yourfile.csv
First,Last,Address,Birthdate,Email
John,Smith,34 La La Lane,14/03/85,johnsmith@email.com

需要注意的一点是,csvkit 假定所有 .csv 文件都有标题行。这就是csvgrep 的结果显示标题行的原因。这也意味着您必须像这样向数据文件添加标题:

First,Last,Address,Birthdate,Email
John,Smith,34 La La Lane,14/03/85,johnsmith@email.com
Sarah,Second,42 Wallaby Way,11/06/92,sarahsecond@email.com
Third,Example,99 Peacock Terrace,04/12/89,thirdexample@email.com 

命令行参数解释:

$ csvgrep -c 4 -r '\d{2}/03' yourfile.csv
-c specifies which column you want to search 
-r specifies the regular expression you want to match in the column

正则表达式 '^\d{2}/03' 将匹配以 2 位数字开头的字符串,然后是 '/',然后是月份 '03'。

查看csvkit tutorial 了解更多信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-27
    • 2018-10-21
    • 2019-09-05
    • 1970-01-01
    • 2011-09-26
    • 1970-01-01
    • 2017-04-24
    相关资源
    最近更新 更多