LINUX.ORG.RU
ФорумTalks

С уделал Python по скорости разработки ;)

 , ,


0

2

Короче, мне надо было сделать следующее. Считать из ASCII-файла с вещественными числами ровно N чисел, причём эти числа идут в файле через пробел и иногда происходит перевод строки, типа такого:

1.45E+4 5E+6 7E+8
2.42E+1 7.7E+2 1E-1 5E-6 4E-6
1E-6 1E-8
.....
Этих чисел в файле M, M ~ 1E+7, N ~ 1E+6

Люблю Python, полез в инет выяснять, как это сделать на нём - везде пример с чтением файла построчно и потом разбор строки. Плюнул и написал прогу на C за пару минут

Eddy_Em, твоя взяла - Python отстой, C рулит :)

Если кто знает, как это сделать в Python без чтения построчно - пишите

Update: размер файла - порядка 24Гигов, надо вывести N-ое число (а не все N чисел)

★★★★☆

Последнее исправление: Sahas (всего исправлений: 1)

Люблю Python

полез в инет выяснять, как это сделать на нём - везде пример с чтением файла построчно и потом разбор строки.

Т.е. ты на своём любимом языке без Интернета не можешь написать построчное чтение файла и простой парсер?

aidan ★★★★
()

Если кто знает, как это сделать в Python без чтения построчно - пишите

Удивлю тебя, так же как и на С: читать в буфер и парсить. А чем построчно то не нравиться?

FIL ★★★★
()
Ответ на: комментарий от amomymous

не фига, я на C кодил мало и тоже полез в инет за примером. В любом случае жду решения на Python :)

Sahas ★★★★☆
() автор топика
Ответ на: комментарий от aidan

Т.е. ты на своём любимом языке без Интернета не можешь написать построчное чтение файла и простой парсер?

я не прогер, мне можно. Я искал вариант именно не построчного чтения

Sahas ★★★★☆
() автор топика

Правильный заголовок

ШОК! Тяп-ляп C-программист не смог написать программу на питоне!

Deleted
()

Заголовок - желтизна. Или давай статистику с количеством задач гораздо больше одной.

Lilly
()
Ответ на: комментарий от FIL

Удивлю тебя, так же как и на С: читать в буфер и парсить. А чем построчно то не нравиться?

и как? пример можно? на C я это сделал так:

  f=fopen("ascii-file","r");

  for (i=0;i<N;i++)
  {
    fscanf(f,"%g ",&num);
  }
  printf("%lg\n",num);

Построчно не нравится, ибо мутить много надо...

Sahas ★★★★☆
() автор топика
Последнее исправление: Sahas (всего исправлений: 1)
Ответ на: комментарий от Sahas

На скорую руку

#!/usr/bin/env python3


if __name__ == '__main__':
	file = open('data.txt', 'r')
	lines = file.readlines()
	file.close()

	numbers = []

	for l in lines:
		if l[0] == '\n':
			continue

		data = l[:-1].split(' ')
		for n in data:
			numbers.append(float(n))

	for n in numbers:
		print(n)

FIL ★★★★
()
Ответ на: комментарий от Deleted

Но претензии то ты решил выкатить тут какие-то.

не претензии, а историю успеха. Я просто удивлён, что не смог за 5 минут найти, как это делается в python (про C, если честно, был немного в курсе, естессно...)

Sahas ★★★★☆
() автор топика
Ответ на: комментарий от Sahas

Берешь, бутылку газировки. Водку разбадяживаешь один к трем, стакан пьешь залпом, отрыгивая CO2 не переборщи, может вылететь ценный продукт. Два стакана и ты начинаешь понимать бренность питонов сей и необходимости рассказов Эдику, что Си все еще торт.

ЗЫ: Ты бы хоть руководство по sed и awk прочитал...

ioway
()
Ответ на: комментарий от FIL

thanks, но это чтение построчно (как, собственно, я и нашел). Кстати, в строке может быть over 1E+5 чисел, Python не поперхнётся?

Sahas ★★★★☆
() автор топика
Ответ на: комментарий от Sahas

ШОК! bash уделывает python и C!

$ cat test 
1.45E+4 5E+6 7E+8
2.42E+1 7.7E+2 1E-1 5E-6 4E-6
1E-6 1E-8
$ awk -vRS=' ' -vFS="\n" '{print $1}' test | head -n5
1.45E+4
5E+6
7E+8
7.7E+2
1E-1
aidan ★★★★
()
Ответ на: комментарий от ioway

ЗЫ: Ты бы хоть руководство по sed и awk прочитал...

надо было сделать быстро - это раз, два - файл размером 24Гига, не уверен, что быстро бы отработало...

Sahas ★★★★☆
() автор топика
Ответ на: комментарий от FIL

понял - в твоем примере читаются все числа, а мне надо только первые N, т.е. еще счётчик надо завести. Чтение построчно не устраивает тем, что много кода =) Ну а так-то конечно это тоже вариант. Я просто удивлён, что в Python нет(?) такой возможности - чтение «сквозь» строки

Sahas ★★★★☆
() автор топика
Ответ на: комментарий от Sahas

Какой-то ты не очень тонкий.
/me уходит из сабжа

FIL ★★★★
()
Ответ на: комментарий от ioway

Согласен. C с O0 прочитал за 1 минуту

Sahas ★★★★☆
() автор топика
Ответ на: комментарий от Sahas

Почему нет? Только вывод в файл сделать, а не в конcоль. Засеки время, врядли awk будет медленнее сишной программы.

aidan ★★★★
()
Ответ на: комментарий от pi11

на 24Г файле Python крепко задумался... Насколько я понял, f.read считывает всё в data сразу, или там «ленивые вычисления»?

Sahas ★★★★☆
() автор топика
Последнее исправление: Sahas (всего исправлений: 1)
Ответ на: комментарий от Sahas

И на сколько больше получится? На 1-2 строки? Наверное можно задачу найти где у C даже поболее 1-строки выигрыш будет.

pi11 ★★★★★
()

как-то так

for _number  in (''.join(file.readlines())).split():
    try:
        number = float(_number)
    except ValueError:
        continue
    # делаешь своё чёрное дело
heilkitty ★★
()
Ответ на: комментарий от aidan

да. мой любимый язык — 99 botles. я на нём не могу решить указанную задачу за пару минут.

next_time ★★★★★
()
Ответ на: комментарий от Sahas

на 24Г файле Python крепко задумался

На таком размере по-строчно считать нужно конечно.

pi11 ★★★★★
()
#!/usr/bin/env python3
СКОКА_НАДО_ЧИСЕЛ = 50
numbers = []
x = []
i = 0

f = open('фаел.txt')
while i < СКОКА_НАДО_ЧИСЕЛ:
    c = f.read(1)
    if c.isspace() or not c:
        if x:
            numbers.append(float(''.join(x)))
            x = []
            i += 1
        if not c:
            break
    else:
        x.append(c)
f.close()

for n in numbers:
    print(n)
print('Всего считано {} чисел'.format(i))

Update. Если нужно только N-е число, внесём очевидное изменение:

#!/usr/bin/env python3
СКОКА_НАДО_ЧИСЕЛ = 50
last_number = None
x = []
i = 0

f = open('фаел.txt')
while i < СКОКА_НАДО_ЧИСЕЛ:
    c = f.read(1)
    if c.isspace() or not c:
        if x:
            last_number = float(''.join(x))
            x = []
            i += 1
        if not c:
            break
    else:
        x.append(c)
f.close()

if last_number == None:
	print('Ни одного числа нету')
elif i == СКОКА_НАДО_ЧИСЕЛ:
	print(last_number)
else:
	print('Всего считано {} чисел, последнее — {}'.format(i, last_number))

proud_anon ★★★★★
()
Последнее исправление: proud_anon (всего исправлений: 1)

Ой, не углядел про неравномерные переводы строки. В этом случае поможет genfromtxt.

Axon ★★★★★
()
Ответ на: комментарий от pi11

И на сколько больше получится? На 1-2 строки?

больше. Потому что пока все варианты с python'ом читают построчно, а на C - по числам.

Sahas ★★★★☆
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.