start counting how many lines of show command after line 20 - python-3.x

Hello I am trying to write a code for counting how many lines after line 20
def line_count(file_name,start=20):
num_lines = 0
with open(file_name,'r') as f:
for line in f:
num_lines += 1
print(num_lines)

An easy way to do this is simply counting the lines in the program and subtracting 20 from it. This is possible in a one-liner:
>>> len(open("file.txt").read().splitlines()) - 20
6
In the above example, this means that the file itself has 26 lines, which is 6 more than 20.

Related

How to skip N central lines when reading file?

I have an input file.txt like this:
3
2
A
4
7
B
1
9
5
2
0
I'm trying to read the file and
when A is found, print the line that is 2 lines below
when B is found, print the line that is 4 lines below
My current code and current output are like below:
with open('file.txt') as f:
for line in f:
if 'A' in line: ### Skip 2 lines!
f.readline() ### Skipping one line
line = f.readline() ### Locate on the line I want
print(line)
if 'B' in line: ## Skip 4 lines
f.readline() ### Skipping one line
f.readline() ### Skipping two lines
f.readline() ### Skipping three lines
line = f.readline() ### Locate on the line I want
print(line)
'4\n'
7
'1\n'
'9\n'
'5\n'
2
>>>
Is printing the values I want, but is printing also 4\n,1\n... and besides that, I need to write several f.realines()which is not practical.
Is there a better way to do this?
My expected output is like this:
7
2
Here is a much simpler code for you:
lines=open("file.txt","r").read().splitlines()
#print(str(lines))
for i in range(len(lines)):
if 'A' in lines[i]:
print(lines[I+2]) # show 2 lines down
elif 'B' in lines[i]:
print(lines[I+4]) # show 4 lines down
This reads the entire file as an array in which each element is one line of the file. Then it just goes through the array and directly changes the index by 2 (for A) and 4 (for B) whenever it finds the line it is looking for.
if you don't like repeated readline then wrap it in a function so the rest of the code is very clean:
def skip_ahead(it, elems):
assert elems >= 1, "can only skip positive integer number of elements"
for i in range(elems):
value = next(it)
return value
with open('file.txt') as f:
for line in f:
if 'A' in line:
line = skip_ahead(f, 2)
print(line)
if 'B' in line:
line = skip_ahead(f, 4)
print(line)
As for the extra output, when the code you have provided is run in a standard python interpreter only the print statements cause output, so there is no extra lines like '1\n', this is a feature of some contexts like the IPython shell when an expression is found in a statement context, in this case f.readline() is alone on it's own line so it is detected as possibly having a value that might be interesting. to suppress this you can frequently just do _ = <expr> to suppress output.

Set in python replacing number 10 from a file with 0,1

I have a file with the line:1 2 3 4 5 10. When I add this line to a set in Python, I get {1,2,3,4,5,0} instead of {1,2,3,4,5,10}. How do I code so that I get the 10 inside the set instead of it recognizing it as a 1 and a 0?
EDIT: This was the code I wrote:
states = set()
line = open("filepath", "r").readlines()[0]
states.add(line)
print (states)
Input file content:
1 2 3 4 5 10
As set cannot have a same number twice, the zero which belongs to 10 is being treated as a unique element thus set cannot contain two same elements.
Do something like this to fix it (Assuming you don't have newline characters, if you do, just use the strip method.):
line = open("filepath", "r").readlines()[0]
line = line.split(' ') #Split by Space
number_set = set(line) #Since file is a list after splitting.

Python 3.x - don't count carriage returns with len

I'm writing the following code as part of my practice:
input_file = open('/home/me/01vshort.txt', 'r')
file_content = input_file.read()
input_file.close()
file_length_question = input("Count all characters (y/n)? ")
if file_length_question in ('y', 'Y', 'yes', 'Yes', 'YES'):
print("\n")
print(file_content, ("\n"), len(file_content) - file_content.count(" "))
It's counting carriage returns in the output, so for the following file (01vshort.txt), I get the following terminal output:
Count all characters (y/n)? y
0
0 0
1 1 1
9
...or...
Count all characters (y/n)? y
0
00
111
9
In both cases, the answer should be 6, as there are 6 characters, but I'm getting 9 as the result.
I've made sure the code is omitting whitespace, and have tested this with my input file by deliberately adding whitespace and running the code with and without the line:
- file_content.count(" ")
Can anyone assist here as to why the result is 9 and not 6?
Perhaps it isn't carriage returns at all?
I'm also curious as to why the result of 9 is indented by 1 whitespace? The input file simply contains the following (with a blank line at the end of the file, line numbers indicated in the example):
1. 0
2. 0 0
3. 1 1 1
4.
...or...
1. 0
2. 00
3. 111
4.
Thanks.
If you want to ignore all whitespace characters including tabs and newlines and other control characters:
print(sum(not c.isspace() for c in file_content))
will give you the 6 you expect.
Alternatively you can take advantage of the fact the .split() method with no argument will split a string on any whitespace character. So split it into non-space chunks and then join them all back together again without the whitespace characters:
print(len(''.join(file_content.split())))
You're getting 9 because the content of the file could be interpreted like:
file_content = "0\n0 0\n1 1 1\n"
and you're only matching the white spaces (file_content.count(" ")).
In order to count only the characters you'd either:
read line by line the file, or
use a regexp to match white space.
For the indenting of 9: print processes the commas as outlined here

how to read lines starting with arithmatic characters in python 3

I'm using readline to read a file, but some of its lines starts with arithmetic characters, readline skips this lines,
any suggestion?
with open(path) as program_file:
for line in program_file:
line = program_file.readline()
print(line)
some of lines are like this:
2 4 5
+ 3 #skip this line
_ 5 9
It's not the lines starting with characters that's the problems, it's that the for line in x and x.readline statements both read a line from the file, so you'll probably get alternate lines printed out. Remove the readline!
with open(path) as program_file:
for line in program_file:
print(line)

How to print names from a text file in Python

I have got a text document that looks something like this
Kei 1 2 3 4 5
Igor 5 6 7 8 9
Guillem 8 7 6 9 5
How can I print their names and their last 3 scores
I came up with this
class_3 = open('class_3','r')
read = class_3.read()
read.split()
print(read)
But it came out with just
K
Please help
You can loop over file object and split the lines, then use a simple indexing to print the expected output:
with open('example.txt') as f:
for line in f:
items = line.split()
print items[0], ' '.join(items[-3:])
Output :
Kei 3 4 5
Igor 7 8 9
Guillem 6 9 5
The benefit of using with statement for opening the file is that it will close the file at the end of the block automatically.
As a more elegant approach you can also use unpacking assignment in python 3.X:
with open('example.txt') as f:
for line in f:
name, *rest = line.split()
print(name, ' '.join(rest))
In python 3.x you will have to change #Kasramvd's answer slightly. You have to add parenthesis around the parameters of the call to the print function.
with open('example.txt') as f:
for line in f:
items = line.split()
print(items[0], ' '.join(items[-3:]))

Resources