Проблема в том, что возвращаемое значение urlopen
- это не простой файл, а поток, поэтому его можно прочитать только один раз.Таким образом, после первого read_csv
:
col_names = pd.read_csv(z_f, sep='\t', nrows=0, skiprows=1)
вы уже прочитали часть потока - эта часть не определена и зависит от реализации read_csv
.
Итак, на второмпрочитайте:
df = pd.read_csv(z_f, sep='\t', dtype=col_dtypes, names=col_names_list, comment="#")
Вы начинаете не с начала файла, а с того места, где остановилось первое чтение, отсюда пропущенные строки и испорченный первый ряд.
К сожалению, я не знаю, нетпростой обходной путь, поэтому ИМХО у вас есть только 2 простых способа:
- записать поток во временный файл, который вы удалите после обработки.Теперь, когда у вас есть настоящий файл, вы сможете открывать его столько раз, сколько вам нужно
- обрабатывать поток за один проход - но вам придется многое изменить в своем коде