python - 将 for 循环中的列表写入 csv

标签 python for-loop export-to-csv sentiment-analysis

我编写了一个 for 循环,它迭代 CSV 以获得如下列表:

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

等等 4000 次。 现在我需要将它们写入一个新的 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,情感]创建一个包含2个字符串项的列表。使用 csv.writer() 将其写入 CSV 文件的正确方法是使用 writerow(bac2data)

代码的最后部分包含许多错误。首先,您以写入模式 ('w') 打开 CSV 文件,获取每一行传入数据。这将每次覆盖文件,丢失除最后一行之外的所有数据。然后,您将迭代 bac2data 列表并在每个项目上调用 writerows()。这会将字符串中的每个字符写在它自己的行上(与您报告的输出相匹配)。

相反,打开输出文件并在主for info in data:循环之外创建一个csv.writer:

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()

关于python - 将 for 循环中的列表写入 csv,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35834654/

相关文章:

python - 二维数组中的 NaN 插值。人口稀少

Python 仅当包含在括号中时才按字符拆分

c# - 在 CSVHelper 中添加虚拟空字段

python - 具有不同批量大小的pytorch恢复模型

python - TensorFlow 中的二进制分类,损失和准确性的意外大值

javascript - Forloop困惑

algorithm - 嵌套循环的运行时间(大O)

r - 在R中的for循环中向列表中添加元素

Excel/CSV - 将键值转换为 csv

python-3.x - 将 Pandas Dataframe 写入到_csv StringIO 而不是文件