从 Arduino 将新数据写入 Python 中的 csv 文件

Write new data in to csv file in Python from an Arduino

我每秒都从 Arduino 接收数据,但我无法保存它,它将连续数据写入 csv 文件的同一单元格中,并且每次获取新值时都会更改它。 我正在尝试使用 newline='' 和写入行,但没有用。

valueenc = (value)
                print("Valueencoded", valueenc)
                #print("Message received: "  + valueenc)
                f = open(f'{root_path}/Desktop/microphone_dump.csv','w+', newline ='')
                #f.write(valueenc)
                with f:
                    write = csv.writer(f) 
                    write.writerows(valueenc)

方法是这样的:

file = open(f'{root_path}/Desktop/test.csv', "a")
                print("Created file")
                file = open(f'{root_path}/Desktop/test.csv', "a") #append the data to the file
                file.write(valueenc + "\n") #write data with a newline
                #close out the file
                file.close()

问题可以使模式 w+(打开文件时删除所有数据)和关闭文件的 with f:

我看到两个可能的解决方案:

首先:只打开文件一次 - 在开始时 - 并且只在结束时关闭一次。

# at start
f = open(f'{root_path}/Desktop/microphone_dump.csv', 'w+')

# ... code ...

valueenc = value
print("Valueencoded", valueenc)
write = csv.writer(f) 
write.writerows(valueenc)

# ... code ...

# at the end
f.close()

但程序出错时可能会丢失数据

第二种:使用模式a追加数据

# ... code ...

valueenc = value
print("Valueencoded", valueenc)

with open(f'{root_path}/Desktop/microphone_dump.csv', 'a') as f:
    write = csv.writer(f) 
    write.writerows(valueenc)

# ... code ...

并且写入后可以直接使用with关闭文件


编辑:

如果你只想写一行有两个值,那么你应该使用 writerow,名称中没有字符 s

with open(f'{root_path}/Desktop/microphone_dump.csv', 'a') as f:
    write = csv.writer(f) 
    write.writerow( [value1, value2] )  # without `s` in name `writerow`

如果你有很多行,那么你可以使用 writerows

rows = [
   [value1, value2],   # row 1
   [value3, value4],   # row 2
]

with open(f'{root_path}/Desktop/microphone_dump.csv', 'a') as f:
    write = csv.writer(f) 
    write.writerows( rows )  # with `s` in name `writerows`

顺便说一句:

即使对于行中的单个值,您也必须使用列表

    write.writerow( [value1] )  # without `s` in name 

rows = [
   [value1],   # row 1
   [value2],   # row 2
]

    write.writerows( rows )  # with `s` in name `writerows`