IO It's input and output , Any program that wants to interact with the outside world , All need to use IO. be relative to java for ,Python Medium IO It's simpler , Easy to use .
This article will introduce in detail Python Medium IO operation .
linux There are three standard inputs and outputs in , Namely STDIN,STDOUT,STDERR, The corresponding number is 0,1,2.
STDIN It's standard input , By default, information is read from the keyboard ;
STDOUT It's standard output , Output results to the terminal by default ;
STDERR It's standard error , Output results to the terminal by default .
That we use a lot 2>&1, Refers to the standard output 、 Standard error specified as the same output path .
python in , We can use print Method to output information .
Let's take a look at print Definition of function :
print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False) Copy code
print Function will objects print to file The specified text stream , With sep Separate and add... At the end end. sep, end, file and flush If there is , Then it must be given in the form of keyword parameters .
All non keyword parameters are converted to strings , And will be written to the stream , With sep Division , And add at the end end. sep and end All must be strings ; They can also be for None, This means using the default values . If not given objects, be print() Write only end.
file The parameter must be one with write(string) Object of method ; If the parameter does not exist or is None, Will use sys.stdout. Because the parameters to be printed are converted to text strings , therefore print() Cannot be used for binary mode file objects . For these objects , have access to file.write(...).
Whether the output is cached usually depends on file, But if flush The keyword parameter is true , The output stream is forced to refresh .
You can see print The output format is relatively simple . Let's look at how to enrich the output format .
If you want to format a string , You can put... Before the beginning quotation mark of a string f or F.
In this case , We can introduce variable values directly into a string , Just put the variables in { and } In the middle .
>>> year = 2016
>>> event = 'Referendum'
>>> f'Results of the {year} {event}'
'Results of the 2016 Referendum'
Copy code In addition to the { } put Python Beyond variables , You can also put functions in it :
>>> import math
>>> print(f'The value of pi is approximately {math.pi:.3f}.')
The value of pi is approximately 3.142.
Copy code stay ':' Passing an integer after it can make the field the minimum character width . Easy column alignment :
>>> table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 7678}
>>> for name, phone in table.items():
... print(f'{name:10} ==> {phone:10d}')
...
Sjoerd ==> 4127
Jack ==> 4098
Dcab ==> 7678
Copy code { } The variable in can also be followed by a conversion sign :'!a' Show application ascii() ,'!s' Show application str(), also '!r' Show application repr():
>>> animals = 'eels'
>>> print(f'My hovercraft is full of {animals}.')
My hovercraft is full of eels.
>>> print(f'My hovercraft is full of {animals!r}.')
My hovercraft is full of 'eels'.
Copy code besides ,str It comes with a powerful format function :
str.format(*args, **kwargs) Copy code
The string that calls this method can contain string literals or in curly braces {} The enclosed replacement fields , Each replacement field can contain a numeric index of the positional parameter , Or the name of a keyword parameter . Each replacement field in the returned string copy is replaced with the string value of the corresponding parameter .
>>> "The sum of 1 + 2 is {0}".format(1+2)
'The sum of 1 + 2 is 3'
Copy code Let's take another example of using indexes :
>>> print('{0} and {1}'.format('spam', 'eggs'))
spam and eggs
>>> print('{1} and {0}'.format('spam', 'eggs'))
eggs and spam
Copy code Look at an example of a keyword :
>>> print('This {food} is {adjective}.'.format(
... food='spam', adjective='absolutely horrible'))
This spam is absolutely horrible.
Copy code Let's take another example of combination :
>>> print('The story of {0}, {1}, and {other}.'.format('Bill', 'Manfred',
other='Georg'))
The story of Bill, Manfred, and Georg.
Copy code There are also examples of very complex combinations :
>>> table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 8637678}
>>> print('Jack: {0[Jack]:d}; Sjoerd: {0[Sjoerd]:d}; '
... 'Dcab: {0[Dcab]:d}'.format(table))
Jack: 4098; Sjoerd: 4127; Dcab: 8637678
Copy code Or use '**' The symbol will table Pass... As a keyword parameter :
>>> table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 8637678}
>>> print('Jack: {Jack:d}; Sjoerd: {Sjoerd:d}; Dcab: {Dcab:d}'.format(**table))
Jack: 4098; Sjoerd: 4127; Dcab: 8637678
Copy code You can also use n type '{:n}' To format numbers :
>>> yes_votes = 42_572_654
>>> no_votes = 43_132_495
>>> percentage = yes_votes / (yes_votes + no_votes)
>>> '{:-9} YES votes {:2.2%}'.format(yes_votes, percentage)
' 42572654 YES votes 49.67%'
Copy code If we just want to Python Object to string , Then you can use repr() perhaps str(), str() A function is a representation used to return a human readable value , and repr() Is used to generate interpreter readable representations .
for instance :
>>> s = 'Hello, world.'
>>> str(s)
'Hello, world.'
>>> repr(s)
"'Hello, world.'"
>>> str(1/7)
'0.14285714285714285'
>>> x = 10 * 3.25
>>> y = 200 * 200
>>> s = 'The value of x is ' + repr(x) + ', and y is ' + repr(y) + '...'
>>> print(s)
The value of x is 32.5, and y is 40000...
>>> # The repr() of a string adds string quotes and backslashes:
... hello = 'hello, world\n'
>>> hellos = repr(hello)
>>> print(hellos)
'hello, world\n'
>>> # The argument to repr() may be any Python object:
... repr((x, y, ('spam', 'eggs')))
"(32.5, 40000, ('spam', 'eggs'))"
Copy code str Object also provides some ways to manually format strings :
>>> for x in range(1, 11): ... print(repr(x).rjust(2), repr(x*x).rjust(3), end=' ') ... # Note use of 'end' on previous line ... print(repr(x*x*x).rjust(4)) ... 1 1 1 2 4 8 3 9 27 4 16 64 5 25 125 6 36 216 7 49 343 8 64 512 9 81 729 10 100 1000 Copy code
String object str.rjust() Method to right align strings in a field of a given width by filling the left with spaces . A similar approach is str.ljust() and str.center().
If the input string is too long , They don't truncate strings , But return as is .
If you want to guarantee the length of the string , You can use slicing : x.ljust(n)[:n] .
You can also use str.zfill() To use 0 Fill string :
>>> '12'.zfill(5) '00012' >>> '-3.14'.zfill(7) '-003.14' >>> '3.14159265359'.zfill(5) '3.14159265359' Copy code
% It can also be used to format strings , Given 'string' % values, be string Medium % The instance will have zero or more values Element substitution . This operation is often called string interpolation .
>>> import math
>>> print('The value of pi is approximately %5.3f.' % math.pi)
The value of pi is approximately 3.142.
Copy code python It's very easy to read files in , Use open() The method can .
open() Will return a file object . Let's take a look at its definition :
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None) Copy code
The first parameter is the filename .
The second parameter is the file open mode , The available modes are :
character
significance
'r'
Read ( Default )
'w'
write in , And truncate the file first
'x'
Exclusive creation , Fail if file already exists
'a'
write in , If the file exists, append
'b'
Binary mode
't'
Text mode ( Default )
'+'
Open for update ( Read and write )
The default mode is 'r' .
Take a look at a open Examples of documents :
>>> f = open('workfile', 'w')
Copy code The file is open , Nature needs to be shut down , So we need to show the call f.close() Method :
>>> f.close() Copy code
Is there any similar java Medium try with resource The function of automatically closing files ?
We can use with, So after the file is used , Will be automatically turned off , Very easy to use .
>>> with open('workfile') as f:
... read_data = f.read()
>>> # We can check that the file has been automatically closed.
>>> f.closed
True
Copy code After the file is closed , If you want to read it again , You're going to report a mistake :
>>> f.close() >>> f.read() Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: I/O operation on closed file. Copy code
After getting the file object , We can call the methods in the file .
f.read(size) Will read some data and use it as a string ( In text mode ) Or byte string object ( In binary mode ) return .
size Is an optional numeric parameter . When size When omitted or negative , Will read and return the contents of the entire file ; When taking other values , Will read and return at most size Characters ( In text mode ) or size Bytes ( In binary mode ). If you have reached the end of the file ,f.read() Will return an empty string ('').
>>> f.read() 'This is the entire file.\n' >>> f.read() '' Copy code
f.readline() Read a line from the file ; A newline (\n) At the end of the string , If the file doesn't end with a newline , Omit... At the last line of the file . If f.readline() Returns an empty string , It means that the end of the file has been reached , The blank line uses '\n' Express , The string contains only one newline character .
>>> f.readline() 'This is the first line of the file.\n' >>> f.readline() 'Second line of the file\n' >>> f.readline() '' Copy code
There's a simpler way to read , It's just traversing through the file :
>>> for line in f: ... print(line, end='') ... This is the first line of the file. Second line of the file Copy code
If you want to read all the lines in the file as a list , You can also use list(f) or f.readlines().
f.write(string) Will be able to string The contents of are written to the file , And returns the number of characters written .
>>> f.write('This is a test\n')
15
Copy code If it's in text mode , So before writing to the file , You need to convert the object to text form , We can use str() To switch .
>>> value = ('the answer', 42)
>>> s = str(value) # convert the tuple to string
>>> f.write(s)
18
Copy code Use f.seek(offset, whence) You can locate the file pointer , Then the subsequent read operation will start from this position .
whence Of 0 The value indicates starting from the beginning of the file ,1 Indicates that the current file location is used ,2 Use the end of the file as a reference point . whence If omitted, the default value is 0, That is, the beginning of the file is used as the reference point .
>>> f = open('workfile', 'rb+')
>>> f.write(b'0123456789abcdef')
16
>>> f.seek(5) # Go to the 6th byte in the file
5
>>> f.read(1)
b'5'
>>> f.seek(-3, 2) # Go to the 3rd byte before the end
13
>>> f.read(1)
b'd'
Copy code JSON It's a very convenient file format for information exchange . Let's see how to use JSON To convert an object to a string :
>>> import json >>> json.dumps([1, 'simple', 'list']) '[1, "simple", "list"]' Copy code
dumps Is to convert an object to json str. json One more dump Method , You can store objects directly into a file .
json.dump(x, f) Copy code
To parse from a file json character string , have access to load:
x = json.load(f) Copy code
JSON The key - The key in a value pair is always
strType of . When an object is transformed into JSON when , All the keys in the dictionary are cast to strings . The result of this is that the dictionary is converted into JSON Then it may not be equal to the original when it is converted back to the dictionary . let me put it another way , If x Keys with non strings , Then there areloads(dumps(x)) != x.