【问题标题】:Python functions to read a .csv file用于读取 .csv 文件的 Python 函数
【发布时间】:2014-10-21 13:03:15
【问题描述】:

我正在编写一个脚本,该脚本需要将唯一 ID 附加到文件名。

文件名取自文本文件(第一个函数),传递给格式化它的第二个函数,然后传递给第三个函数,该函数应该搜索具有多列的 .csv 文件,找到正确的行(包含通过其他两个函数传入的值的行)并从“FID”列中的那一行获取值(作为 int 或字符串)。然后它应该打印这个值。

代码:

def get_file_name():
    # this func gets the name of the file to be renamed
    before_rename = open('C:/Users/my.path/before_rename.txt', 'r')
    to_be_renamed_unf = before_rename.readline()[1:]
    # remove the end CRs & LFs off of the string
    to_be_renamed = to_be_renamed_unf.strip()
    print("File name: " + to_be_renamed)
    return to_be_renamed

def get_fname():
    # get farmer name
    file_name = get_file_name()
    farmer_name = re.sub('[^A-Z]', ' ', file_name).rstrip().lstrip()
    print(farmer_name)
    return farmer_name

def get_id_from_file():
    # search csv for COOP & Name to find the FID
    csvfile = 'C:/Users/my.path/csv_file_to_read_from.csv'
    # create a dictionary from the csv
    csv_dict = csv.DictReader(open(csvfile))

    fname = get_fname()
    coop_name = 'CALMAN' 
    for row in csvfile:
        if fname and coop_name in row:  
            farmer_id = int(row['FID'])
            print(farmer_id)

get_id_from_file()

以及当前的输出:

File name: unformatted_file_NAME 03928
NAME

所以看起来它完全跳过了搜索循环;因为这是前两个函数的预期输出,我没有收到任何错误。

一些 .csv:

FID,Name,COOP
12345-29981662553784,bar FOO BAR, FOOBAR
12345-29981662553784,FOO BAR, FOOBAR
12345-29981662553784,FOO BAR, FOOBAR
12345-29981662553784,FOO BAR, FOOBAR
12345-29981662553784,FOO BAR, FOOBAR
12345-29981662553784,FOO BAR, FOOBAR
12345-29981662553784,FOO BAR, FOOBAR
12345-29981662553784,FOO BAR, FOOBAR
12345-29981662553784,FOO BAR, FOOBAR
12345-29981662553784,FOO BAR, FOOBAR
12345-29981662553784,FOO BAR, FOOBAR
12345-29981662553784,FOO BAR, FOOBAR
12345-29981662553784,FOO BAR, FOOBAR

【问题讨论】:

  • 到目前为止我发现了两个问题。首先,for row in csvfile 将遍历文件名的每个字母。为避免混淆,该变量的更好名称可能是csv_file_name。二、fname and coop_name in row不等同于(fname in row) and (coop_name in row),它等同于bool(fname) and (coop_name in row)
  • 有没有办法让它们都成为布尔值?然后我如何遍历整个 csv 行?
  • 我不完全明白你想要做什么,但你可能想遍历csv_dict,而不是csvfile

标签: python csv file-io


【解决方案1】:

试试这个:

#!/usr/bin/env python
#-*- coding:utf-8 -*-

import csv

def get_file_name():
    # this func gets the name of the file to be renamed
    before_rename = open('C:/Users/my.path/before_rename.txt', 'r')
    to_be_renamed_unf = before_rename.readline()[1:]
    # remove the end CRs & LFs off of the string
    to_be_renamed = to_be_renamed_unf.strip()
    print("File name: " + to_be_renamed)
    return to_be_renamed

def get_fname():
    # get farmer name
    file_name = get_file_name()
    farmer_name = re.sub('[^A-Z]', ' ', file_name).rstrip().lstrip()
    print(farmer_name)
    return farmer_name

def get_id_from_file():
    # search csv for COOP & Name to find the FID
    csvfile = 'C:/Users/my.path/csv_file_to_read_from.csv'
    # create a dictionary from the csv
    csv_dict = csv.DictReader(open(csvfile))

    fname = get_fname()
    coop_name = 'CALMAN' 
    for row in csv_dict:
        if fname in row:
            if coop_name in row:
                farmer_id = int(row['FID'])
                print(farmer_id)

get_id_from_file()

【讨论】:

  • 我只是在尝试,但遇到了 UnicodeDecodeError。这是否意味着它正在工作并且问题现在在 csv 文件中?
  • @DrBrown 是的,这是与此问题无关的解码/编码错误。如果这有帮助,请接受它。 :)
【解决方案2】:

您是否尝试过使用 pandas.read_csv?使这种对 csv 的读取和搜索/过滤比您和我可能编写的任何内容都更有效。

http://pandas.pydata.org/pandas-docs/stable/generated/pandas.io.parsers.read_csv.html

【讨论】:

  • 这将是一个繁重的脚本,所以我宁愿使用尽可能少的库,但如果我不能这样做,我会尝试使用 Pandas.read_csv
  • 好吧...我发现 pandas 对任何涉及数据的事情都非常有用,它几乎是我大部分项目的主要内容。
猜你喜欢
  • 2021-11-04
  • 1970-01-01
  • 1970-01-01
  • 2023-02-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-12
  • 1970-01-01
  • 2016-11-29
相关资源
最近更新 更多