Конечно! Настройка:
>>> import pandas as pd
>>> from random import randint
>>> df = pd.DataFrame({'A': [randint(1, 9) for x in xrange(10)],
'B': [randint(1, 9)*10 for x in xrange(10)],
'C': [randint(1, 9)*100 for x in xrange(10)]})
>>> df
A B C
0 9 40 300
1 9 70 700
2 5 70 900
3 8 80 900
4 7 50 200
5 9 30 900
6 2 80 700
7 2 80 400
8 5 80 300
9 7 70 800
Мы можем применить операции столбца и получить объекты Boolean Series:
>>> df["B"] > 50
0 False
1 True
2 True
3 True
4 False
5 False
6 True
7 True
8 True
9 True
Name: B
>>> (df["B"] > 50) & (df["C"] == 900)
0 False
1 False
2 True
3 True
4 False
5 False
6 False
7 False
8 False
9 False
[Обновить, чтобы перейти к новому стилю .loc
]:
И тогда мы можем использовать их для индексации в объект. Для доступа к чтению вы можете привязывать индексы:
>>> df["A"][(df["B"] > 50) & (df["C"] == 900)]
2 5
3 8
Name: A, dtype: int64
, но вы можете столкнуться с проблемами из-за различий между представлением и копией, выполняющими это для доступа к записи. Вместо этого вы можете использовать .loc
:
>>> df.loc[(df["B"] > 50) & (df["C"] == 900), "A"]
2 5
3 8
Name: A, dtype: int64
>>> df.loc[(df["B"] > 50) & (df["C"] == 900), "A"].values
array([5, 8], dtype=int64)
>>> df.loc[(df["B"] > 50) & (df["C"] == 900), "A"] *= 1000
>>> df
A B C
0 9 40 300
1 9 70 700
2 5000 70 900
3 8000 80 900
4 7 50 200
5 9 30 900
6 2 80 700
7 2 80 400
8 5 80 300
9 7 70 800
Обратите внимание, что я случайно сделал == 900
, а не != 900
или ~(df["C"] == 900)
, но я слишком ленив, чтобы исправить это. Упражнение для читателя. : ^)
Вы уверены, что это fopen
, а не тайм-аут вашего скрипта? По умолчанию обычно около 30 секунд или около того, и если ваш файл занимает больше времени для чтения, это может привести к его отключению.
Еще одна вещь, которую следует учитывать, может быть ограничением памяти на вашем скрипте - чтение файла в массив может зайти по этому пути, поэтому проверьте свой журнал ошибок на наличие предупреждений о памяти.
Если ни одна из перечисленных выше не является вашей проблемой, вы можете изучить fgets
, чтобы читать файл по очереди, обрабатывая по мере поступления.
$handle = fopen("/tmp/uploadfile.txt", "r") or die("Couldn't get handle");
if ($handle) {
while (!feof($handle)) {
$buffer = fgets($handle, 4096);
// Process buffer here..
}
fclose($handle);
}
Редактировать
PHP, похоже, не выдает ошибку, это просто возвращает false.
Правилен ли путь к
$rawfile
относительно того, где работает скрипт? Возможно, попробуйте установить абсолютный путь здесь для имени файла.
Не уверен, что вы решили проблему. Я также пытался обработать большой файл, натолкнувшись на веб-сайт, который, на мой взгляд, может быть ответом.
Использование команды yield.
https: // www. sitepoint.com/performant-reading-big-files-php/
Я использовал fopen для открытия видеофайлов для потоковой передачи, используя php-скрипт в качестве сервера потоковой передачи видео, и у меня не было проблем с файлами размером более 50/60 МБ.
Ну, вы можете попробовать использовать функцию readfile, если хотите просто вывести файл.
Если это не так - возможно, вам стоит подумать о дизайне приложения, зачем вы хотите открыть такие большие файлы в веб-запросах?
для меня, fopen()
был очень медленным с файлами более 1mb, file()
намного быстрее.
Просто пытаясь читать строки 100 за раз и создавать пакетные вставки, fopen()
принимает 37 секунд против file()
занимает 4 секунды. Должен быть, что string->array
шаг встроен в file()
Я бы попробовал все параметры обработки файлов, чтобы увидеть, какая из них будет лучше работать в вашем приложении.
Если проблема вызвана ударом ограничения памяти, вы можете попробовать установить более высокое значение (это может работать или не зависит от конфигурации php).
это устанавливает ограничение на память до 12 Мб
ini\_set("memory_limit","12M");
stream_get_line
быстрее, чемfgets
проверьте этот сравнительный gist.github.com/joseluisq/6ee3876dc64561ffa14b – joseluisq 11 March 2016 в 17:04