python新手问题:将代码转换为类

时间:2010-07-28 15:38:08

标签: python class csv

我有这段代码:

import csv
import collections

def do_work():
      (data,counter)=get_file('thefile.csv')
      b=samples_subset1(data, counter,'/pythonwork/samples_subset3.csv',500)
      return

def get_file(start_file):

        with open(start_file, 'rb') as f:
            data = list(csv.reader(f))
            counter = collections.defaultdict(int)

            for row in data:
              counter[row[10]] += 1
            return (data,counter)

def samples_subset1(data,counter,output_file,sample_cutoff):

      with open(output_file, 'wb') as outfile:
          writer = csv.writer(outfile)
          b_counter=0
          b=[]
          for row in data:
              if counter[row[10]] >= sample_cutoff:
                 b.append(row) 
                 writer.writerow(row)
                 b_counter+=1
      return (b)

我最近开始学习python,并希望从良好的习惯开始。因此,我想知道您是否可以帮助我开始将此代码转换为类。我不知道从哪里开始。

2 个答案:

答案 0 :(得分:4)

根据我对原帖的评论,我认为这里不需要上课。但是,如果其他Python程序员读过这篇文章,我建议将它与Python样式指南PEP8内联。这是一个快速重写:

import csv
import collections

def do_work():
    data, counter = get_file('thefile.csv')
    b = samples_subset1(data, counter, '/pythonwork/samples_subset3.csv', 500)

def get_file(start_file):
    with open(start_file, 'rb') as f:
        counter = collections.defaultdict(int)
        data = list(csv.reader(f))

        for row in data:
            counter[row[10]] += 1

    return (data, counter)

def samples_subset1(data, counter, output_file, sample_cutoff):
    with open(output_file, 'wb') as outfile:
        writer = csv.writer(outfile)
        b = []
        for row in data:
            if counter[row[10]] >= sample_cutoff:
                b.append(row) 
                writer.writerow(row)

    return b

注意:

  1. 没有人使用超过4个空格 缩进永远。使用2 - 4.而且全部 你的缩进水平应该 比赛。
  2. 在参数之间使用逗号后使用单个空格 功能(“F(a,b,c)”没有 “F(A,B,C)”)
  3. 函数结尾处的Naked返回语句 毫无意义。功能没有 return语句隐式返回 None
  4. 周围的单一空间 运算符(a = 1,而不是a = 1)
  5. 不要 在括号中包装单个值。 它看起来像一个元组,但事实并非如此。
  6. b_counter根本没用过,所以我 删除它。
  7. csv.reader返回一个迭代器,您将其转换为列表。这通常是一个坏主意,因为它迫使Python一次将整个文件加载到内存中,而迭代器将根据需要返回每一行。理解迭代器对于编写高效的Python代码是绝对必要的。我现在已经离开了data,但你可以重写在你使用data的所有地方使用迭代器,这是一个列表。

答案 1 :(得分:2)

好吧,我不确定你想成为一个班级。你知道上课是什么吗?您想创建一个类来表示某种类型的 thing 。如果我正确理解您的代码,您希望过滤CSV以仅显示row[ 10 ]至少sample_cutoff个其他行共享的行。当然,使用Excel过滤器可以比在Python中读取文件更容易吗?

另一个帖子中的人提出的是真的,但并不适用于你的情况。你不必要地使用了很多全局变量:如果它们对代码是必要的,你应该把所有东西放到一个类中并使它们成为属性,但是因为你首先不需要它们,所以没有必要制作一个类。

有关您的代码的一些提示:

  • 不要将文件转换为列表。这使得Python一次性将所有内容读入内存,如果你有一个大文件,那就太糟糕了。相反,只需遍历文件本身for row in csv.reader(f):然后,当您想第二次浏览文件时,只需执行f.seek(0)返回顶部并重新开始。

  • 不要将return放在每个函数的末尾;那是不必要的。您也不需要括号:return spam没问题。

重写

import csv
import collections

def do_work():
    with open( 'thefile.csv' ) as f:
        # Open the file and count the rows.
        data, counter = get_file(f)

        # Go back to the start of the file.
        f.seek(0)

        # Filter to only common rows.
        b = samples_subset1(data, counter, 
            '/pythonwork/samples_subset3.csv', 500)

     return b

def get_file(f):
    counter = collections.defaultdict(int)
    data = csv.reader(f)

    for row in data:
        counter[row[10]] += 1

    return data, counter

def samples_subset1(data, counter, output_file, sample_cutoff):
    with open(output_file, 'wb') as outfile:
        writer = csv.writer(outfile)
        b = []
        for row in data:
            if counter[row[10]] >= sample_cutoff:
                b.append(row) 
                writer.writerow(row)

    return b