Когда я пишу в файл CSV, он пишет только во второй раз

1

Я участвую в процессе обучения и сталкиваюсь с этой проблемой.

writer = csv.writer(open("db.csv", "w"))
connection = sqlite3.connect('hx.db')
cur_baseboard = connection.cursor()
cur_baseboard.execute('select * from baseboard')
writer.writerows(cur_baseboard)

Когда я запускаю этот код, первый раз он создает файл csv db.csv, но ничего не пишет. После того, как я запустил его во второй раз, он заполняет значения в db! Где я ошибся? Пожалуйста, просветите меня.

  • 0
    Возможно, запись буферизована, попробуйте del writer после writerows .
Теги:
csv

3 ответа

3

Вы не закрываете базовый файл в конце, поэтому данные не сбрасываются. Кроме того, вы должны использовать флаг "b", чтобы убедиться, что файл открыт в двоичном режиме. (http://docs.python.org/library/csv.html#csv.writer) Использование:

from __future__ import with_statement
with open("db.csv", "wb") as f:
    writer = csv.writer(f)
    [...]
# File is closed automatically after end of with block.
  • 0
    Плохой способ обработки файлов, смотрите мой ответ.
  • 0
    Какой ответ? Кроме того, какой из двух способов?
Показать ещё 3 комментария
1

Вы можете использовать оператор with, чтобы гарантировать, что все будет записано в fileobj, как только оно будет завершено.

with open('db.csv','wb') as fi:
    writer = csv.writer(fi)

Конечно, у вас не будет с некоторыми из ранних питонов, но вы всегда можете импортировать его в будущем

from __future__ import with_statement

EDIT: Изменено для открытия в двоичном режиме, спасибо за указание на это.

  • 0
    Откройте файл в двоичном режиме!
  • 0
    Готово. Спасибо за указание, прошло некоторое время, так как я использовал CSV.
0

Возможно, что ваш sql возвращается в пустую строку в первый раз? Это не проблема с модулем csv, просто используйте свою первую и последнюю строку, а вместо cur_baseboard напишите случайный текст, и вы обнаружите, что он всегда будет написан.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню