3

これで .txt ファイルを使用すると、各行は次のようになります。

 1/2/09,902,898.5,905.25,913.25,914.5,914.25,915.5,924.5,926.25,929.25,927.5,926

.txt ファイルには、おそらく 50 行あります。

これが私が作ったコードです:

class PriceProcesseor(object):

    import csv
    import datetime

    def __init__(self, text_file_with_prices):
        self.text_file_with_prices = text_file_with_prices
        self.file_each_date_is_a_list_of_strings = self.__turn_file_into_list()

    def __turn_file_into_list(self):
        self.text_file_with_prices1 = open(self.text_file_with_prices, 'rU')
        self.text_file_with_prices2 = csv.reader(self.text_file_with_prices1)
        return self.text_file_with_prices2

    def file_as_list(self):
        '''Returns the file as a list of strings'''
        self.whole_file_as_list_of_lists = []
        for x in self.file_each_date_is_a_list_of_strings:
            self.whole_file_as_list_of_lists.append(x)
        return self.whole_file_as_list_of_lists

    # Make a method that can return any given line

    def return_line(self,line_number):
        self.line_number = line_number
        return self.file_as_list()[line_number]

    def the_works(self):
        self.the_works_list = []
        for date in self.file_as_list():
            self.mini_list = []
            for item in date:
                if '/' in item:
                    self.date = str(datetime.datetime.strptime(item,'%m/%d/%y'))
                    self.date_munged = self.date.strip('00:00:00')
                    self.date_munged_1 = self.date_munged.strip()
                    self.mini_list.append(self.date_munged_1)
                elif '/' not in item:
                    self.mini_list.append(float(item))
            self.the_works_list.append(self.mini_list)
        return self.the_works_list

しかし、私がこれを行うとき:

my_file = '/directory1/directory2/the_file.txt'
xyz = PriceProcesseor(my_file)
xyz.the_works()

エラーメッセージが表示されます:

NameError: global name 'csv' is not defined

何が間違っていますか?

4

2 に答える 2

3

importステートメントをクラス定義の外に置きます。

import csv
import datetime

class PriceProcesseor(object):
#etc.

クラス ブロックはスコープを作成します。そのスコープ内のものをインポートすると、それらはそのスコープ内でのみアクセス可能になります。クラス スコープは、クラスのメソッドから直接アクセスできないため、インポートされたモジュールを見ることができません。

于 2013-01-06T03:56:54.453 に答える
1

したがって、正しい方法は次のようになります。

import csv
import datetime

class PriceProcesseor(object):


    def __init__(self, text_file_with_prices):
        self.text_file_with_prices = text_file_with_prices
        self.file_each_date_is_a_list_of_strings = self.__turn_file_into_list()

    def __turn_file_into_list(self):
        self.text_file_with_prices1 = open(self.text_file_with_prices, 'rU')
        self.text_file_with_prices2 = csv.reader(self.text_file_with_prices1)
        return self.text_file_with_prices2

    def file_as_list(self):
        '''Returns the file as a list of strings'''
        self.whole_file_as_list_of_lists = []
        for x in self.file_each_date_is_a_list_of_strings:
            self.whole_file_as_list_of_lists.append(x)
        return self.whole_file_as_list_of_lists

    # Make a method that can return any given line

    def return_line(self,line_number):
        self.line_number = line_number
        return self.file_as_list()[line_number]

    def the_works(self):
        self.the_works_list = []
        for date in self.file_as_list():
            self.mini_list = []
            for item in date:
                if '/' in item:
                    self.date = str(datetime.datetime.strptime(item,'%m/%d/%y'))

次に、ファイルを ABC123.py として保存します。import ABC123 と入力すると、すべてが完全に機能します。

于 2013-01-06T18:04:07.890 に答える