有没有更好的方法来忽略文件中的头文件?

2024-10-03 15:25:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我写了一个文件读取代码文件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

Tags: and文件方法代码selfdictionarydeforder
2条回答

您有一个CSV format文件,因此用一个内置的^{}类实例来处理它是有意义的,它允许您通过自动跳过头来简化代码,还可以使代码更具可读性。你知道吗

还要注意的是,您根本不需要使用iter(),因为与文件一样,csv.DictReader实例已经是iterable了。你知道吗

由于您的示例代码不包含完整的类,因此出于演示的目的,我编写了一个类,并向OrderDepth类添加了一个__repr__()方法,以使打印它们更具可读性。你知道吗

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)}
def set_order_details(self):

        iter_order = iter(self.order_file.readlines()[1:])

        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

相关问题 更多 >