【问题标题】:Writing a CSV table from column variables?从列变量编写 CSV 表?
【发布时间】:2020-02-06 13:15:12
【问题描述】:

我是 Python 的初学者,很抱歉,如果它是微不足道的,但我无法解决问题。

我有 3 个包含浮点数的列表。

mouse_x = [-0.01, -0.01, -0.01, -0.01, -0.01, -0.01, -0.01, -0.01, -0.01, -0.01]
mouse_y = [-0.14888888888888888, -0.14888888888888888, -0.14888888888888888, -0.14888888888888888, -0.14888888888888888, -0.14888888888888888, -0.14888888888888888, -0.14888888888888888, -0.14888888888888888, -0.14888888888888888]
mouse_time = [1.5307196849607863, 1.581636800954584, 1.6135933389887214, 1.6362467749859206, 1.6675526530016214, 1.6996790579869412, 1.7314749069628306, 1.7635557259782217, 1.7962380870012566, 1.826124977960717]

我想要做的是组合这三个变量,使它们成为我的 csv 文件的 3 列。它应该如下所示:

mouse_x, mouse_y, mouse_time
-0.01, -0.14888888888888888, 1.5307196849607863
-0.01, -0.14888888888888888, 1.581636800954584
-0.01, -0.14888888888888888, 1.6135933389887214
...
...

这是我尝试过的:

with open('my_file.csv', 'w', newline='') as f:
    thewriter = csv.writer(f)
    thewriter.writerow(['mouse_x', 'mouse_y', 'mouse_time'])
    counter = 0
    for x in mouse_x_list:
        thewriter.writerows(mouse_x_list[counter], mouse_y_list[counter], mouse_time_list[counter])
        counter +=1

这会产生以下错误:

TypeError: writerows() 只接受一个参数(给定 3 个)

我将非常感谢任何提示!

【问题讨论】:

  • CSV wirter 只允许一个参数。将其放入一个循环中并从该索引中的每个列表中写入项目。

标签: python csv writing


【解决方案1】:

您需要将writerows 更改为writerow 并将三个参数包装成一个列表[...]

thewriter.writerow ( [mouse_x_list[counter], mouse_y_list[counter], mouse_time_list[counter]])

csv.writerows 需要一个 row 对象,但writerow 也接受简单的列表——就像你之前用来写出标题一样。

不相关,但您可以省略 counter,使用 zip 将这三个列表合并为一个:

for a,b,c in zip(mouse_x_list,mouse_y_list,mouse_time_list):
    thewriter.writerow ( [a,b,c])

【讨论】:

  • 更简单的方法是省略循环,只做thewriter.writerows(zip(mouse_x, mouse_y, mouse_time))
  • 对于它的价值,我有一个示例,说明如何在我自己的答案中实施 tfw 的使用 zip 的建议。看起来像 tfw 和我在这里的想法很像。
【解决方案2】:

你会接受使用numpy吗?我发现这种应用程序非常简单:

您生成一个多维数组,其中每一列都是您的列表之一:

import numpy as np

arr = np.array([mouse_x, mouse_y, mouse_time])

通过这种方式,您可以使用arr[:, 0] 访问mouse_x、使用arr[:, 1] 访问mouse_y 以及使用arr[:, 2] 访问mouse_time

一旦你有了这个数据结构,numpy 就会提供一个内置函数来保存数组:

np.savetxt('mouse.csv', arr.T, delimiter=',')

【讨论】:

    【解决方案3】:

    这是一种无需使用 NumPy 或 Pandas 即可编写 CSV 文件的方法:

    with open('my_file.csv', 'w') as f:
        thewriter = csv.writer(f)
        thewriter.writerow(['mouse_x', 'mouse_y', 'mouse_time'])
        len_rows = len(mouse_x)
        for counter in range(len_rows):
            thewriter.writerow([mouse_x[counter], mouse_y[counter], mouse_time[counter]])
    

    请注意,您不需要在此处自行增加 counter 变量;与range() 一起使用的for 语句已经将counter 设置为0、1 等等。请注意,在for 循环中,我使用的是writerow not writerows

    使用for 循环编写 CSV 文件的一种可能更“Pythonic”的方法是这样做:

    with open('my_file.csv', 'w') as f:
        thewriter = csv.writer(f)
        thewriter.writerow(['mouse_x', 'mouse_y', 'mouse_time'])
        for mx, my, mtime in zip(mouse_x, mouse_y, mouse_time):
            thewriter.writerow([mx, my, mtime])
    

    现在,writerows() 采用 iterable 行,例如行的列表或元组。一个可迭代的,松散地说,是你在for 语句中的“in”之后放置的内容。如果您有一个元组列表,其中列表中的元组i(mouse_x[i], mouse_y[i], mouse_time[i]),那么您可以将该元组列表传递给writerows() 并完成它。或者,可以使用上述for 循环中的zip(mouse_x, mouse_y, mouse_time) 本身 作为writerows() 的参数:

    with open('my_file.csv', 'w') as f:
        thewriter = csv.writer(f)
        thewriter.writerow(['mouse_x', 'mouse_y', 'mouse_time'])
        thewriter.writerows(zip(mouse_x, mouse_y, mouse_time))
    

    可以说,这更符合 Python 风格,不管它值多少钱。

    【讨论】:

      【解决方案4】:

      您也可以先使用 pandas 制作数据框,然后将其保存为 csv 文件:

           import pandas as pd
      
           df = pd.DataFrame()
           df.insert(0, 'mouse_x', mouse_x)
           df.insert(1, 'mouse_y', mouse_y)
           df.insert(2, 'mouse_time', mouse_time)
           df
      

      输出:

              mouse_x mouse_y mouse_time
            0 -0.01   -0.148889   1.530720
            1 -0.01   -0.148889   1.581637
            2 -0.01   -0.148889   1.613593
            3 -0.01   -0.148889   1.636247
            4 -0.01   -0.148889   1.667553
            5 -0.01   -0.148889   1.699679
            6 -0.01   -0.148889   1.731475
            7 -0.01   -0.148889   1.763556
            8 -0.01   -0.148889   1.796238
            9 -0.01   -0.148889   1.826125
      

      保存到 csv:

           df.to_csv('name_file.csv')
      

      【讨论】:

        【解决方案5】:

        Numpy 是关于存储在数组中的数据的最佳库之一。它还包括将数组直接保存到文件的实现。看看如何使用它here

        【讨论】:

          【解决方案6】:

          如果你想使用pandas:

          import pandas as pd
          df=pd.DataFrame([mouse_x,mouse_y,mouse_time])
          df.T.to_csv('my_file.csv', index=False, header=['mouse_x','mouse_y','mouse_time'])
          

          【讨论】:

          • 我已经删除了最后一个括号,它也能正常工作!谢谢!!
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-07-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-08-18
          相关资源
          最近更新 更多