Ler intervalo de linhas em um arquivo texto com Python

816 views
Skip to first unread message

Adeilson souza da silva

unread,
Dec 8, 2014, 2:17:52 PM12/8/14
to python...@googlegroups.com
Boa tarde,
gostaria de uma ajuda no seguinte;
tenho um arquivo de entrada com vários IDs que preciso consultar em uma solicitação web, mas só consigo fazer um por vez. Gostaria de consultar 100 por vez, que é o máximo que posso fazer por solicitação, e depois mostrar esses um por linha. Eu consigo fazer como no código abaixo um por vez mas gostaria de 100 por vez porquê seria mais rápido, um exemplo do que estou fazendo:

 #!/usr/bin/env python
#-*- coding: utf-8 -*-

if __name__ == '__main__':
    f = file('ids.txt')
while True:
  line = f.readline()  ### preciso ler 100 linhas por vez
  line_int = int(line)
  url = "https://api.twitter.com/1.1/users/lookup.json?user_id=%d"   ### aqui eu passo um id por vez mas gostaria de 100 por vez
  url = url % (line_int)
  response = session.get(url)
  print response
  if(response.status_code == 200):
      print line_int,"Existe"    ## exibir um por linha de cada 100
  else:
      if(response.status_code == 404):
          print line_int,"Não existe" exibir um por linha de cada 100

Alguma sugestão?
 

Alex

unread,
Dec 9, 2014, 7:30:54 AM12/9/14
to python...@googlegroups.com
for x in range(0, len(items) + 100, 100):
    print items[x: x + 100]

Resulta em:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99]

[100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199]

[200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299]

[300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399]

[400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499]

[500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, 599]

[600, 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, 699]

[700, 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, 763, 764, 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, 775, 776, 777, 778, 779, 780, 781, 782, 783, 784, 785, 786, 787, 788, 789, 790, 791, 792, 793, 794, 795, 796, 797, 798, 799]

[800, 801, 802, 803, 804, 805, 806, 807, 808, 809, 810, 811, 812, 813, 814, 815, 816, 817, 818, 819, 820, 821, 822, 823, 824, 825, 826, 827, 828, 829, 830, 831, 832, 833, 834, 835, 836, 837, 838, 839, 840, 841, 842, 843, 844, 845, 846, 847, 848, 849, 850, 851, 852, 853, 854, 855, 856, 857, 858, 859, 860, 861, 862, 863, 864, 865, 866, 867, 868, 869, 870, 871, 872, 873, 874, 875, 876, 877, 878, 879, 880, 881, 882, 883, 884, 885, 886, 887, 888, 889, 890, 891, 892, 893, 894, 895, 896, 897, 898, 899]

[900, 901, 902, 903, 904, 905, 906, 907, 908, 909, 910, 911, 912, 913, 914, 915, 916, 917, 918, 919, 920, 921, 922, 923, 924, 925, 926, 927, 928, 929, 930, 931, 932, 933, 934, 935, 936, 937, 938, 939, 940, 941, 942, 943, 944, 945, 946, 947, 948, 949, 950, 951, 952, 953, 954, 955, 956, 957, 958, 959, 960, 961, 962, 963, 964, 965, 966, 967, 968, 969, 970, 971, 972, 973, 974, 975, 976, 977, 978, 979, 980, 981, 982, 983, 984, 985, 986, 987, 988, 989, 990, 991, 992, 993, 994, 995, 996, 997, 998, 999]

[] # eu não espera isso mais não deve ser um problema

Use readlines do objeto arquivo para gerar os items.

Arnaldo Russo

unread,
Dec 9, 2014, 7:31:28 AM12/9/14
to python-brasil
Olá Adeilson,

Não sou a pessoa mais indicada a comentar algo por aqui, mas vi seu problema e talvez isso possa funcionar.
Talvez usar um for loop correndo de 100 em 100 no len do número de linhas.

gen_ix = len(f.readlines())
ix = 0
for i in range(100, gen_ix, 100):
    lines = f.readlines()[ix : i]
    ix += 100

com os índices variando entre os ranges do comprimento que você deseja, no caso de 100 em 100.
Não testei aqui, mas ficam meus dois cents furados.

Abraço,
Arnaldo.


---
Arnaldo D'Amaral Pereira Granja Russo
Lab. de Estudos dos Oceanos e Clima
Instituto de Oceanografia - FURG



--
--
------------------------------------
Grupo Python-Brasil
http://www.python.org.br/wiki/AntesDePerguntar
 
<*> Para visitar o site do grupo na web, acesse:
http://groups.google.com/group/python-brasil
 
<*> Para sair deste grupo, envie um e-mail para:
python-brasi...@googlegroups.com

---
Você recebeu essa mensagem porque está inscrito no grupo "Python Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para python-brasi...@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.

Gabriel Miranda Carvalho

unread,
Dec 9, 2014, 10:28:46 AM12/9/14
to python...@googlegroups.com

Gostei da solução do Alex, porém se usar o bom e velho while seria menos pythonico? Já q está acessando os elementos pelo índex e não iterando sobre eles. Com o while acho q seria mais simples e mais performático caso seja em Python2.x por causa do range(). Fica ai minha dúvida.

Adeilson souza da silva

unread,
Dec 10, 2014, 5:20:51 PM12/10/14
to python...@googlegroups.com
Confesso que tentei entender o que os colegas sugeriram mas não ficou bem claro, estou tentando entender e ver se funciona com a minha idéia. Voltou a perguntar em seguida.

Eduardo Oliva

unread,
Dec 11, 2014, 3:35:09 PM12/11/14
to python...@googlegroups.com
Cara, seguinte, se você der uma olhada na doc de Input/Output do Python (https://docs.python.org/2/tutorial/inputoutput.html) irá reparar que o método readline lê uma linha do arquivo por vez, e o método readlines, lê todas as linhas e joga numa lista, creio que para você a segunda opção seja melhor.

Então o que precisa ser feito é ler todas as linhas do arquivo (readlines) e percorrer essa lista de 100 em 100, pra isso você pode usar tanto o seu loop while qnto um loop for, ou mesmo com list comprehension.

Você pode também dentro do seu while, ler os 100 primeiros itens, e deletá-los da lista, isso funciona para deletar os 100 primeiros:

del list[:100]

E depois vc continua o loop normalmente para iterar sobre os próximos itens..

Veja que não é uma abordagem das mais performáticas, pois a deleção de itens consome um pouco, você poderia também usar uma variável para manter a referencia dos índices que você quer ler, sendo assim, só é necessário mudar essa variável que a lista vai "andando" conforme esse índice, e você não precisa deletar nada.

Enfim, são várias abordagens, escolha uma e siga em frente ;)

Att

Adeilson souza da silva

unread,
Dec 23, 2014, 5:01:43 PM12/23/14
to python...@googlegroups.com
Alguma ajuda no seguinte:
Preciso pegar de 100 em 100 e consultar na url que permite no máximo 100 ids por consulta, já consigo fazer assim, mas não sei como fazer para pegar de 100 em 100 da lista. Alguém ajuda?
f = file('ids.txt').read().splitlines() #aqui eu leio os ids de entrada e crio uma lista com os ids
    f = [int(i) for i in f] # aqui converto todos para inteiro
    line = f[0:99] quando faço f[0], por exemplo, funciona mas nào aceita a lista
    url = "https://api.twitter.com/1.1/users/lookup.json?user_id=%d"
    url = url % (line) # line é uma lista, só funciona de 1 a 1
    response = session.get(url)
    user = json.loads(response.content)
    print user
  
    Como pegar os elementos da lista e consultar de 100 em 100??

Alex Sandro

unread,
Dec 23, 2014, 7:30:15 PM12/23/14
to python...@googlegroups.com

Claro que não vai aceitar a lista. Se você der uma olhada na documentação da api, verá que a lista precisa ser do tipo " Comma-separated"

https://icl.googleusercontent.com/?lite_url=http://pt.m.wikipedia.org/wiki/Comma-separated_values&ei=q1NRWf3H&lc=pt-BR

Ou seja EXATAMENTE isso: ",".join(ids[0:99])

Com a declaração acima você passa a ter uma strings de ids ex: "1,2,3,4,5..."

Se você quer trabalhar com uma api, precisar ler sua documentação.

Você recebeu essa mensagem porque está inscrito em um tópico no grupo "Python Brasil" dos Grupos do Google.
Para cancelar inscrição nesse tópico, acesse https://groups.google.com/d/topic/python-brasil/-QR1o8gsSjM/unsubscribe.
Para cancelar inscrição nesse grupo e todos os seus tópicos, envie um e-mail para python-brasi...@googlegroups.com.
Reply all
Reply to author
Forward
0 new messages