簡體   English   中英

將列表從for循環寫入csv

[英]Writing a list from a for loop into a csv

我編寫了一個for循環,該循環遍歷CSV以獲得這樣的列表:

[t1, s1]
[t2, s2]
[t3, s3]

所以四千次 現在,我需要將它們寫入一個新的CSV文件中,在其中填充2個字段,並用逗號分隔。 輸入此內容時,我只會從最后一個循環中獲得最后一個列表,並且單元格中只有一個字符。

def sentiment_analysis():
    fo = open("positive_words.txt", "r")
    positive_words = fo.readlines()
    fo.close()
    positive_words = map(lambda positive_words: positive_words.strip(), positive_words)
    fo = open("negative_words.txt", "r")
    negative_words = fo.readlines()
    fo.close()
    negative_words = map(lambda negative_words: negative_words.strip(), negative_words)
    fo = open("BAC.csv", "r")
    data = fo.readlines()
    fo.close()
    data = map(lambda data: data.strip(), data)
    x1 = 0 #number of bullish
    x2 = 0 #number of bearish
    x3 = 0 #number of unknown
    for info in data:
        data_specs = info.split(',')
        time_n_date = data_specs[0]
        sentiment = data_specs[2]
        '''Possibly precede with a nested for loop for data_specs???'''
        if sentiment == 'Bullish':
            '''fo.write(time + ',' + 'Bullish' + '\n')'''
        elif sentiment == 'Bearish':
            ''' fo.write(time + ',' + 'Bearish' + '\n')'''
        else:
            x3 += 1
            positive = 0
            negative = 0
            content_words = data_specs[1].split()
            for a in positive_words:
                for b in content_words:
                    if (a == b):
                        positive = positive + 1
            for c in negative_words:
                for d in content_words:
                    if (c == d):
                        negative = negative + 1
            if positive > negative:
                '''fo.write(time + ',' + 'Bullish' + '\n')'''
                sentiment = 'Bullish'
            elif positive < negative:
                sentiment = 'Bearish'
            else:
                sentiment = 'Neutral'
        bac2data = [time_n_date, sentiment]
        print bac2data
        fo = open("C:\Users\Siddhartha\Documents\INFS 772\Project\Answer\BAC2_answer.csv", "w")
        for x in bac2data:
            w = csv.writer(fo, delimiter = ',')
            w.writerows(x)
        fo.close()

我的for循環並沒有經歷全部。

在您的代碼bac2data = [time_n_date, sentiment]創建一個包含2個字符串項的列表。 使用csv.writer()將其寫入CSV文件的正確方法是使用writerow(bac2data)

代碼的最后一部分包含許多錯誤。 首先,您要針對輸入數據的每一行以寫模式( 'w' )打開CSV文件。 每次都會覆蓋該文件,除了最后一行,所有數據都會丟失。 然后,您遍歷bac2data列表並在每個項目上調用writerows() 這將在單獨的行中寫入字符串中的每個字符(與您報告的輸出匹配)。

相反,打開輸出文件並在csv.writer之外創建一個csv.writer for info in data: loop中的信息:

fo = open("C:\Users\Siddhartha\Documents\INFS 772\Project\Answer\BAC2_answer.csv", "w")
writer = csv.writer(fo)
for info in data:
    ....

然后將這些行替換為主循環的底部:

    bac2data = [time_n_date, sentiment]
    print bac2data
    fo = open("C:\Users\Siddhartha\Documents\INFS 772\Project\Answer\BAC2_answer.csv", "w")
    for x in bac2data:
        w = csv.writer(fo, delimiter = ',')
        w.writerows(x)
    fo.close()

有了這個:

    bac2data = [time_n_date, sentiment]
    print bac2data
    writer.writerow(bac2data)

工作完成后,不再需要打印bac2data進行調試,您只需使用1行即可:

    writer.writerow((time_n_date, sentiment)]

更新

功能的完整代碼:

def sentiment_analysis():
    fo = open("positive_words.txt", "r")
    positive_words = fo.readlines()
    fo.close()
    positive_words = map(lambda positive_words: positive_words.strip(), positive_words)
    fo = open("negative_words.txt", "r")
    negative_words = fo.readlines()
    fo.close()
    negative_words = map(lambda negative_words: negative_words.strip(), negative_words)
    fo = open("BAC.csv", "r")
    data = fo.readlines()
    fo.close()
    data = map(lambda data: data.strip(), data)
    x1 = 0 #number of bullish
    x2 = 0 #number of bearish
    x3 = 0 #number of unknown

    fo = open("C:\Users\Siddhartha\Documents\INFS 772\Project\Answer\BAC2_answer.csv", "w")
    writer = csv.writer(fo)

    for info in data:
        data_specs = info.split(',')
        time_n_date = data_specs[0]
        sentiment = data_specs[2]
        '''Possibly precede with a nested for loop for data_specs???'''
        if sentiment == 'Bullish':
            '''fo.write(time + ',' + 'Bullish' + '\n')'''
        elif sentiment == 'Bearish':
            ''' fo.write(time + ',' + 'Bearish' + '\n')'''
        else:
            x3 += 1
            positive = 0
            negative = 0
            content_words = data_specs[1].split()
            for a in positive_words:
                for b in content_words:
                    if (a == b):
                        positive = positive + 1
            for c in negative_words:
                for d in content_words:
                    if (c == d):
                        negative = negative + 1
            if positive > negative:
                '''fo.write(time + ',' + 'Bullish' + '\n')'''
                sentiment = 'Bullish'
            elif positive < negative:
                sentiment = 'Bearish'
            else:
                sentiment = 'Neutral'

        bac2data = [time_n_date, sentiment]
        print bac2data
        writer.writerow(bac2data)

    fo.close()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM