У меня была та же проблема, и поскольку я использую бета-версию XCode, мне пришлось искать установку в /Downloads/Xcode-beta.app
.
Кстати, для меня было решение открыть XCode, перейти в «Настройки» и выбрать вкладку «Местоположения». Раскрывающийся список Command Line Tools
был пустым, и мне пришлось нажать его и выбрать версию (Xcode 9.0 в моем случае). Затем я запустил bazel clean --expunge
и повторил процесс сборки без получения ошибки. Надеюсь, это кому-нибудь поможет.
По сути, вы знаете, что закончились после того, как у вас закончились. Таким образом, вы можете обернуть итератор reader
, например, следующим образом:
def isLast(itr):
old = itr.next()
for new in itr:
yield False, old
old = new
yield True, old
и изменить свой код на:
for line_num, (is_last, row) in enumerate(isLast(reader)):
if not is_last: assert len(row) == len(header)
и т. Д.
Просто увеличьте строку до длины заголовка:
for line_num, row in enumerate(reader):
while len(row) < len(header):
row.append('')
...
Если у вас есть ожидание фиксированного количества столбцов в каждой строке, тогда вы должны защититься от:
(1) ЛЮБАЯ строка будет короче - например, писатель (SQL Server / Query Analyzer IIRC) может пропустить завершающие NULL наугад ; пользователи могут возиться с файлом с помощью текстового редактора, в том числе оставлять пустые строки.
(2) ЛЮБАЯ строка длиннее, например запятые не цитируются должным образом.
Не нужно никаких хитростей. Просто старомодный if-тест в вашем цикле чтения строк:
for row in csv.reader(...):
ncols = len(row)
if ncols != expected_cols:
appropriate_action()
Не могли бы вы просто поймать ошибку, когда программа чтения csv считывает последнюю строку в
попытке: ... делай здесь свои дела ... за исключением: StopIteration
condition?
См. следующий код Python в stackoverflow, чтобы узнать, как использовать try: catch: Проблемы Python CSV DictReader / Writer