使用csv.reader时接收错误:__ enter__(打开(..)

时间:2018-04-22 10:39:21

标签: python attributeerror with-statement

我收到以下错误输入代码:

Traceback (most recent call last):
File "C:\Users\XXX\Sentiment Analysis-vader.py", line 34, in <module>
    f.printer()

File "C:\Users\XXX\Sentiment Analysis-vader.py", line 18, in printer
    with csv.reader(open('analyse_' + str(bloombergcode) + '.csv', 'r'), delimiter= ",",quotechar='|') as q2:

AttributeError: __enter__

Process finished with exit code 1

我使用了以下代码:

import csv
from nltk.sentiment.vader import SentimentIntensityAnalyzer


class VaderSentiment:
    def __init__(self, bloomcode):
        self.bloomcode = bloomcode


    def print_sentiment_scores(self, sentence):
        self.sentence = sentence
        analyser = SentimentIntensityAnalyzer()
        snt = analyser.polarity_scores(self.sentence)
        print("{:-<40} {}".format(self.sentence, str(snt)))

    def printer(self):
        bloombergcode = self.bloomcode
        with csv.reader(open('analyse_' + str(bloombergcode) + '.csv', 'r'), delimiter= ",",quotechar='|') as q2:
            for line in q2:
                for field in line:
                    print_sentiment_scores(field)

for code in ('AAPL', 'NFLX'):
    f = VaderSentiment(code)
    f.printer()
    time.sleep(1)

我已经看到了其他一些类似问题(Python Json with returns AttributeError: __enter__),但解决方案无法解决我的问题。

有没有人看到问题?

提前致谢并提出最好的问候

////编辑:

感谢标记为有用的贡献,我最终使用的代码(在得到我解决的另一个错误之后)

import csv
from nltk.sentiment.vader import SentimentIntensityAnalyzer
import time

class VaderSentiment:
    def __init__(self, bloomcode):
        self.bloomcode = bloomcode


    def print_sentiment_scores(self, sentence):
        self.sentence = sentence
        analyser = SentimentIntensityAnalyzer()
        snt = analyser.polarity_scores(self.sentence)
        print("{:-<40} {}".format(self.sentence, str(snt)))

    def printer(self):
        bloombergcode = self.bloomcode

        with open(f'analyse_{str(bloombergcode)}.csv', 'r') as csv_file:
            q2 = csv.reader(csv_file, delimiter=",", quotechar='|')
            for line in q2:
                for field in line:
                    self.print_sentiment_scores(field)

for code in ('AAPL', 'NFLX'):
    f = VaderSentiment(code)
    f.printer()
    time.sleep(1)

1 个答案:

答案 0 :(得分:0)

您没有正确使用csv.reader。它不支持放在with statement内,这就是您收到AttributeError: __enter__错误的原因。

尝试按照usage example中的相同方式执行此操作:

with open('analyse_' + str(bloombergcode) + '.csv', 'r') as csv_file:
    q2 = csv.reader(csv_file, delimiter=',', quotechar='|')
    for line in q2:
        # ..rest of your code..

with内包裹open(因为open支持它,实际上是推荐使用它的方式),然后在其中使用csv.reader