将numpy数组保存到csv会产生不匹配错误

时间:2017-04-14 19:27:02

标签: python arrays csv numpy tweepy

我从twitter收集了一堆推文并将其保存到列表中,然后将列表转换为numpy数组并尝试将其保存为CSV文件。

然而,当我尝试这样做时,我收到以下错误:

Traceback (most recent call last):
  File "/usr/local/lib/python3.5/dist-packages/numpy/lib/npyio.py", line 1215, in savetxt
    fh.write(asbytes(format % tuple(row) + newline))
TypeError: a float is required

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/keva161/Documents/Projects/Twitter Sentiment/main.py", line 66, in <module>
    main("Trump")
  File "/home/keva161/Documents/Projects/Twitter Sentiment/main.py", line 20, in main
    collect_tweets(api, query)
  File "/home/keva161/Documents/Projects/Twitter Sentiment/main.py", line 54, in collect_tweets
    save_to_csv(tweets_array)
  File "/home/keva161/Documents/Projects/Twitter Sentiment/main.py", line 62, in save_to_csv
    np.savetxt('test.csv', tweets_array)
  File "/usr/local/lib/python3.5/dist-packages/numpy/lib/npyio.py", line 1219, in savetxt
    % (str(X.dtype), format))
TypeError: Mismatch between array dtype ('<U144') and format specifier ('%.18e %.18e %.18e %.18e %.18e %.18e %.18e')

以下是我的代码:

def collect_tweets(api, query):

    tweets_array = []

    public_tweets = api.search(q=query, count=10)

    print("Collecting tweets...")

    for tweet in public_tweets:

        userid = api.get_user(tweet.user.id)
        username = userid.screen_name

        location = tweet.user.location

        tweetText = tweet.text

        analysis = TextBlob(tweet.text)
        polarity = analysis.sentiment.polarity

        datestamp = tweet.created_at
        time = datestamp.strftime("%H:%M")
        year = datestamp.strftime("%d-%m-%Y")

        if (not tweet.retweeted) and ('RT @' not in tweet.text):
            retweet = "Yes"
        else:
            retweet = "No"

        tweets_array.append([username, location, tweetText, retweet, time, year, polarity])

    print("Done!")
    save_to_csv(tweets_array)

def save_to_csv(tweets_array):
    print('Saving to CSV')

    new_array = np.array(tweets_array)
    #headers = ['Username', 'Location', 'Tweet', 'Retweeted', 'Time', 'Year', 'Polarity']
    #np.savetxt("test_file.csv", new_array.flatten(), delimiter=",", fmt='%s')
    np.savetxt('test.csv', tweets_array)

2 个答案:

答案 0 :(得分:2)

重新访问np.savetxt的文档。您可以使用fmt参数指定用于每个数组列或整个行的格式。此默认值假定您要保存浮点数组。

默认fmt是一个通用浮点格式,由数组中的列数复制。显然你的数组有七列:'%。18e%.18e%.18e%.18e%.18e%.18e%.18e'。

但是错误表明这些列中至少有一列,也许整个数组包含字符串,而不是数字。错误中的dtype'

fmt='%s'应该让你写这个数组。但检查结果。可能需要一些调整。

您注释掉了使用此格式的行:

np.savetxt("test_file.csv", new_array.flatten(), delimiter=",", fmt='%s')

那有什么问题?

savetxt不是一个复杂的功能。它只是在数组上进行迭代,并将每个'row'写入文件:

for row in your_array:
    fh.write(asbytes(format % tuple(row) + newline))

其中format%.18e的长字符串或由fmt参数构建的内容。

保存2d数字数组时,

savetxt最有意义。使用字符串数组或复合dtype(结构化),定义有用的format更难。

答案 1 :(得分:0)

您应该使用csv模块。所以,假设你使用的是Python 3,你需要这样的东西:

import csv
headers = ['Username', 'Location', 'Tweet', 'Retweeted', 'Time', 'Year', 'Polarity']

def save_to_csv(tweets_list, headers, path="test.csv"):
    print('Saving to CSV')
    with open(path, 'w', newline='') as f:
        writer = csv.writer(f)
        # write header
        writer.writerow(header)
        # write rest of data
        writer.writerows(tweets_list)

甚至不要与numpy混淆。将列表列表转换为字符串数组然后仅将其用于np.savetxt对于numpy来说不是一个好的用例。