首页 > 解决方案 > 有没有更好的方法来忽略文件中的标题?

问题描述

我在 python 中编写了一个文件读取代码文件。但我不喜欢我的方法,例如使用next(iter)忽略标题。我需要一些建议来改进此代码。

文件格式:

OrderId, OrderName
1, Washing powder
2, Diaper
3, Cola
4, ToothPaste
5, Handfree

代码:

def set_order_details(self):

    order_record = self.order_file.readlines()

    iter_order = iter(order_record)
    next(iter_order) #For removing Headers

    for order_detail in iter_order:
        order_and_detail = order_detail.rstrip().split(',')

        if len(order_and_detail) == 2:
            self.order_dictionary[(order_and_detail[0])] = OrderDepth(order_and_detail[1])

    return self.order_dictionary


class OrderDepth:
    def __init__(self, order):
        self.order = order
        self.depth = 0

标签: pythonpython-3.xcsv

解决方案


您有一个CSV 格式文件,因此使用内置csv.DictReader类的实例对其进行处理是有意义的,并且可以通过自动跳过标题来简化代码,并使代码更具可读性。

还要注意,您根本不需要使用iter(),因为像文件一样,csv.DictReader实例已经是可迭代的。

由于您的示例代码不包含完整的类,因此我制作了一个用于演示目的,并且还向该类添加了一个__repr__()方法以OrderDepth使打印它们更具可读性。

import csv
from pprint import pprint


class OrderDepth:
    def __init__(self, order, depth=0):
        self.order = order
        self.depth = depth

    def __repr__(self):
        classname = self.__class__.__name__
        return f'{classname}(order={self.order!r}, depth={self.depth})'


class Foo:
    def __init__(self, filename):
        self.csv_file = open(filename, 'r', newline='')
        self.order_file = csv.DictReader(self.csv_file, skipinitialspace=True)

    def set_order_details(self):
        self.order_dictionary = {}
        for order_detail in self.order_file:
            if len(order_detail) == 2:
                od = OrderDepth(order_detail['OrderName'])
                self.order_dictionary[order_detail['OrderId']] = od
        return self.order_dictionary


foo = Foo("orders.csv")
order_dictionary = foo.set_order_details()
pprint(order_dictionary)

样本输出:

{'1': OrderDepth(order='Washing powder', depth=0),
 '2': OrderDepth(order='Diaper', depth=0),
 '3': OrderDepth(order='Cola', depth=0),
 '4': OrderDepth(order='ToothPaste', depth=0),
 '5': OrderDepth(order='Handfree', depth=0)}

推荐阅读