我正在尝试将一些随机数据添加到文本文件中,但是我很成功,但是我遇到了标题行问题。我想一次添加标题行,然后每次运行脚本时,它应该只将数据添加到文件中,如果存在则忽略标题行。我尝试过类似的操作,但失败了。我尝试在SO python csv中查看此示例代码,仅编写一次标头,但无法正确实现。如果有人帮助我更正我的代码。我会很感激的。
import random
import csv
import os.path
from time import gmtime, strftime
filename = '/home/robdata/collection1.dat'
file_exists = os.path.isfile(filename)
v = random.randint(0, 100)
with open(filename, "a") as csvfile:
headers = ['DATE', 'value']
writer = csv.DictWriter(csvfile, delimiter=',', lineterminator='\n',fieldnames=headers)
if not file_exists:
writer.writeheader() # file doesn't exist yet, write a header
writer.writerow({'DATE': strftime("%Y-%m-%d %H:%M:%S", gmtime()), 'value': v})
Run Code Online (Sandbox Code Playgroud)
它插入数据,但不添加任何标题行。我想在第一次运行脚本时包含标头,而下次运行脚本多次时,它应该仅添加数据,而不添加标头行。非常感谢您的任何想法或帮助。
与其测试文件是否存在,您还可以通过查找到末尾并询问文件位置(当然仍然需要追加)来检查文件是否存在零长度。
当文件为空但仍然存在时,此方法还将为这种情况写入标头。它还避免了需要import os单独os.stat()确定文件大小:
import random
import csv
from time import gmtime, strftime
headers = ['DATE', 'value']
v = random.randint(0, 100)
with open('collection1.dat', 'a', newline='') as f_output:
csv_output = csv.DictWriter(f_output, fieldnames=headers)
f_output.seek(0, 2)
if f_output.tell() == 0:
csv_output.writeheader()
csv_output.writerow({'DATE': strftime("%Y-%m-%d %H:%M:%S", gmtime()), 'value': v})
Run Code Online (Sandbox Code Playgroud)
writeheader() 然后仅在文件为空时才用于写入标头。
注意:如果 Python 2.x 仍在使用,您应该始终以二进制模式打开文件,例如ab:
with open('collection1.dat', 'ab') as f_output:
Run Code Online (Sandbox Code Playgroud)
对于Evans先生而言,一种更简单的替代方法是使用以下测试代替存在性测试:
fileEmpty = os.stat('collection1.dat').st_size == 0
Run Code Online (Sandbox Code Playgroud)
这消除了进行搜索等的需要。
编辑:完整代码:
import random
import csv
import os.path
from time import gmtime, strftime
filename = '/home/robdata/collection1.dat'
fileEmpty = os.stat(filename).st_size == 0
v = random.randint(0, 100)
with open(filename, "a") as csvfile:
headers = ['DATE', 'value']
writer = csv.DictWriter(csvfile, delimiter=',', lineterminator='\n',fieldnames=headers)
if fileEmpty:
writer.writeheader() # file doesn't exist yet, write a header
writer.writerow({'DATE': strftime("%Y-%m-%d %H:%M:%S", gmtime()), 'value': v})
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5098 次 |
| 最近记录: |