Это потому, что метод 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();
with open('document.csv','a') as fd:
fd.write(myCsvRow)
Открытие файла с параметром 'a'
позволяет добавлять к концу файла вместо простой перезаписи существующего содержимого. Попробуйте это.
Я предпочитаю это решение, используя модуль 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'
.
Вы открываете файл с режимом «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» в режим, поэтому вы можете использовать его платформу независимо для всех двоичных файлов.
blockquote>
Основываясь на ответе @GM и обращая внимание на предупреждение @John La Rooy, я смог добавить новую строку, открыв файл в режиме 'a'
.
Даже в окна, чтобы избежать проблемы с новой строкой, вы должны объявить его как
newline=''
.Теперь вы можете открыть файл в режиме
blockquote >'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), но я думаю, что все будет хорошо.
# 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)