Как заставить csv writer перемещаться в новую строку, когда данные хранятся в предыдущей строке python [duplicate]

Это потому, что метод Scanner.nextInt не использует символ последней новой строки вашего ввода и, следовательно, newline потребляется в следующий вызов Scanner.nextLine .

Вы столкнетесь с аналогичным поведением, когда вы используете Scanner.nextLine после Scanner.next() или любого метода Scanner.nextFoo (кроме самого nextLine).

Обход проблемы:

  • Пропустить пустой Scanner.nextLine вызов после Scanner.nextInt или Scanner.nextFoo, чтобы потреблять остальную часть этой линии, включая newline
    int option = input.nextInt();
    input.nextLine();  // Consume newline left-over
    String str1 = input.nextLine();
    
  • Или было бы еще лучше, если вы прочитаете ввод через Scanner.nextLine и преобразуете свой ввод в нужный формат. Например, к целому числу с использованием метода Integer.parseInt(String) .
    int option = 0;
    try {
        option = Integer.parseInt(input.nextLine());
    } catch (NumberFormatException e) {
        e.printStackTrace();
    }
    String str1 = input.nextLine();
    

106
задан guaka 6 October 2015 в 13:22
поделиться

5 ответов

with open('document.csv','a') as fd:
    fd.write(myCsvRow)

Открытие файла с параметром 'a' позволяет добавлять к концу файла вместо простой перезаписи существующего содержимого. Попробуйте это.

137
ответ дан davidism 26 August 2018 в 14:22
поделиться

Я предпочитаю это решение, используя модуль csv из стандартной библиотеки и оператор with , чтобы не оставлять файл открытым.

Ключевым моментом является использование 'a' для добавления при открытии файла.

import csv   
fields=['first','second','third']
with open(r'name', 'a') as f:
    writer = csv.writer(f)
    writer.writerow(fields)

В Windows могут возникнуть лишние новые строки. Вы можете попытаться избежать их, используя 'ab' вместо 'a'.

82
ответ дан G M 26 August 2018 в 14:22
поделиться

Вы открываете файл с режимом «a» вместо «w»?

См. Чтение и запись файлов в документах python

7.2. Чтение и запись файлов

open () возвращает объект файла и чаще всего используется с двумя аргументами: open (имя файла, режим).

>>> f = open('workfile', 'w')
>>> print f <open file 'workfile', mode 'w' at 80a0960>

Первый аргумент - это строка, содержащая имя файла. Второй аргумент - это другая строка, содержащая несколько символов, описывающих способ использования файла. mode может быть «r», когда файл будет считан только «w» только для записи (существующий файл с тем же именем будет удален), а «a» открывает файл для добавления; любые данные, записанные в файл, автоматически добавляются в конец. 'r +' открывает файл для чтения и записи. Параметр mode не является обязательным; «r» будет приниматься, если он опущен.

В Windows, «b», добавленный в режим, открывает файл в двоичном режиме, поэтому существуют также такие режимы, как «rb», «wb» и «rb», г + Ь». Python в Windows делает различие между текстовыми и двоичными файлами; конечные символы в текстовых файлах автоматически изменяются, когда данные считываются или записываются. Эта за кадром модификация файловых данных отлично подходит для текстовых файлов ASCII, но это приведет к повреждению двоичных данных, подобных этим в файлах JPEG или EXE. Будьте очень осторожны, чтобы использовать двоичный режим при чтении и записи таких файлов. В Unix не помешает добавить «b» в режим, поэтому вы можете использовать его платформу независимо для всех двоичных файлов.

9
ответ дан John La Rooy 26 August 2018 в 14:22
поделиться

Основываясь на ответе @GM и обращая внимание на предупреждение @John La Rooy, я смог добавить новую строку, открыв файл в режиме 'a'.

Даже в окна, чтобы избежать проблемы с новой строкой, вы должны объявить его как newline=''.

Теперь вы можете открыть файл в режиме 'a' (без b).

import csv

with open(r'names.csv', 'a', newline='') as csvfile:
    fieldnames = ['This','aNew']
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)

    writer.writerow({'This':'is', 'aNew':'Row'})

Я не пытался с обычным автором (без Dict), но я думаю, что все будет хорошо.

1
ответ дан Natacha 26 August 2018 в 14:22
поделиться
# I like using the codecs opening in a with 
field_names = ['latitude', 'longitude', 'date', 'user', 'text']
with codecs.open(filename,"ab", encoding='utf-8') as logfile:
    logger      = csv.DictWriter(logfile, fieldnames=field_names)
    logger.writeheader()

# some more code stuff 

    for video in aList:
      video_result = {}                                     
      video_result['date'] = video['snippet']['publishedAt']
      video_result['user'] = video['id']
      video_result['text']=video['snippet'] ['description'].encode('utf8')
      logger.writerow(video_result)    
0
ответ дан Sheece Gardazi 26 August 2018 в 14:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: