Python Forum
How to append integers from file to list? - Printable Version

+- Python Forum (https://python-forum.io)
+-- Forum: Python Coding (https://python-forum.io/forum-7.html)
+--- Forum: General Coding Help (https://python-forum.io/forum-8.html)
+--- Thread: How to append integers from file to list? (/thread-39570.html)



How to append integers from file to list? - Milan - Mar-10-2023

Hello team,

I would like to make a list with the numbers from this file: [attachment=2273]

I can't seem to find anything online, tried these two sources:

https://www.geeksforgeeks.org/how-to-read-text-file-into-list-in-python/
https://stackoverflow.com/questions/34966059/how-to-append-from-file-into-list-in-python

but they append all the numbers as one string in the list. Wall

Could you please assist?

Thanks in advance,

Milan


RE: How to append integers from file to list? - deanhystad - Mar-10-2023

Both links read the file and splt the contents into strings. You need to then convert the strings to ints.


RE: How to append integers from file to list? - Milan - Mar-10-2023

I tried two solutions from the list, they being:
all_values = []

with open('message.txt', newline='') as infile:
    for line in infile:
        all_values.extend(int(line.strip().split(',')))
my_file = open("message.txt", "r")
  
# reading the file
data = my_file.read()
  
# replacing end of line('/n') with ' ' and
# splitting the text it further when '.' is seen.
data_into_list = int(data.replace('\n', ' ').split("."))
  
# printing the data
print(data_into_list)
my_file.close()
Both of them prompt the error
Error:
TypeError: int() argument must be a string, a bytes-like object or a real number, not 'list'



RE: How to append integers from file to list? - Axel_Erfurt - Mar-10-2023

in_text = "202 137 390 235 114 369 198 110 350 396 390 383 225 258 38 291 75 324 401 142 288 397"

all_values = []

for line in in_text.split(" "):
    all_values.append(int(line))
    
print(all_values)
Output:
[202, 137, 390, 235, 114, 369, 198, 110, 350, 396, 390, 383, 225, 258, 38, 291, 75, 324, 401, 142, 288, 397]



RE: How to append integers from file to list? - deanhystad - Mar-10-2023

Your test file doesn't have any commas. The delimiter is space. You cannot blindly copy code. You need to understand what the code does and then apply the idea to your particular problem.


RE: How to append integers from file to list? - Milan - Mar-10-2023

Why don't you explain it nicely like a normal person then?


RE: How to append integers from file to list? - deanhystad - Mar-10-2023

(Mar-10-2023, 05:14 PM)Milan Wrote: Why don't you explain it nicely like a normal person then?
I am being quite polite and respectful. I am assuming that you are capable of looking at the examples and thinking about what they are doing. I think you would eventually notice the values are separated by commas in the examples, but your test file doesn't have any commas. Then you would realize that the delimiter for your split command has to be a space. Or, in other words, don't blindly copy the example. Think about what it is doing. Apply the idea to solving your problem.


RE: How to append integers from file to list? - menator01 - Mar-10-2023

Just to throw out one more way

in_text = "202 137 390 235 114 369 198 110 350 396 390 383 225 258 38 291 75 324 401 142 288 397"
nums = [int(n) for n in list(in_text.split())]
print(nums)
Output:
[202, 137, 390, 235, 114, 369, 198, 110, 350, 396, 390, 383, 225, 258, 38, 291, 75, 324, 401, 142, 288, 397]



RE: How to append integers from file to list? - DeaD_EyE - Mar-11-2023

Working with data from the forum:
from collections import Counter
from urllib.request import urlopen, Request

values = list(
    map(
        int,
        urlopen(
            Request(
                "https://python-forum.io/attachment.php?aid=2273",
                headers={
                    "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/110.0"
                },
            )
        )
        .read()
        .split(),
    )
)
top_5 = Counter(values).most_common(5)
Try it online

The solution for crap_data.txt could be:
from itertools import chain

with open("crap_data.txt") as fd:
    values = list(map(int, chain.from_iterable(line.split() for line in fd)))
chain.from_iterable chains iterables together and returns is an iterator.
chain.from_iterable is called with the generator expression: line.split() for line in fd
Iterating over an open file, yields lines (line-seperator included).
The map function calls for each element from chain.from_iterable the function int.
The map function returns an iterator and must be consumed, e.g. with list.

This style does not allow exception handling inside the hidden loops.
If you expect even crappier data, then the naive approach is better.

values = [] # <- we want the int's here

with open("crap_data.txt") as fd:
    for line in fd:
        for word in line.split():
            try:
                value = int(word)
            except ValueError:
                continue
            values.append(value)
Or this example.

crap_data.txt (white space included additionally)
    
    
    
    
    
    202 137 390 235 114 369 198 110 350 396 390 383 225 258 38 291 75 324 401 142 288 397   
    202 137 390 235 114 369 198 110 350 396 390 383 225 258 38 291 75 324 401 142 288 397
    202 137 390 235 114 369 198 110 350 396 390 383 225 258 38 291 75 324 401 142 288 397
    202 137 390 235 114 369 198 110 350 396 390 383 225 258 38 291 75 324 401 142 288 397
    202 137 390 235 114 369 198 110 350 396 390 383 225 258 38 291 75 324 401 142 288 397
    202 137 390 235 114 369 198 110 350 396 390 383 225 258 38 291 75 324 401 142 288 397
    202 137 390 235 114 369 198 110 350 396 390 383 225 258 38 291 75 324 401 142 288 397
    202 137 390 235 114 369 198 110 350 396 390 383 225 258 38 291 75 324 401 142 288 397
    202 137 390 235 114 369 198 110 350 396 390 383 225 258 38 291 75 324 401 142 288 397