KoreanFoodie's Study

파이썬 - 파일 입출력 정리, 디버깅 본문


파이썬 - 파일 입출력 정리, 디버깅

GoldGiver 2019. 4. 23. 15:32

파이썬에서 까먹을 수 있는 자잘한 사항들을 리마인드하는 포스트입니다.

코드들은 automatetheboringstuff.com에서 참조했습니다.


쉘 예제

  • Backslash on Windows and Forward Slash on OS X and Linux
>>> import os
>>> os.path.join('usr', 'bin', 'spam')

The os.path.join() function is helpful if you need to create strings for filenames. These strings will be passed to several of the file-related functions introduced in this chapter. For example, the following example joins names from a list of filenames to the end of a folder’s name:

>>> myFiles = ['accounts.txt', 'details.csv', 'invite.docx']
>>> for filename in myFiles:
        print(os.path.join('C:\\Users\\asweigart', filename))
  • The Current Working Directory
>>> import os
>>> os.getcwd()
>>> os.chdir('C:\\Windows\\System32')
>>> os.getcwd()
  • Absolute vs. Relative Paths

An absolute path, which always begins with the root folder.

A relative path, which is relative to the program’s current working directory.

>>> os.path.abspath('.')
>>> os.path.abspath('.\\Scripts')
>>> os.path.isabs('.')
>>> os.path.isabs(os.path.abspath('.'))

>>> os.path.relpath('C:\\Windows', 'C:\\')
>>> os.path.relpath('C:\\Windows', 'C:\\spam\\eggs')
>>> os.getcwd() 'C:\\Python34'
  • Creating New Folders with os.makedirs()
>>> import os
>>> os.makedirs('C:\\delicious\\walnut\\waffles')
  • Finding File Sizes and Folder Contents
>>> os.path.getsize('C:\\Windows\\System32\\calc.exe')
>>> os.listdir('C:\\Windows\\System32')
['0409', '12520437.cpx', '12520850.cpx', '5U877.ax', 'aaclient.dll',
'xwtpdui.dll', 'xwtpw32.dll', 'zh-CN', 'zh-HK', 'zh-TW', 'zipfldr.dll']
  • Checking Path Validity
>>> os.path.exists('C:\\Windows')
>>> os.path.exists('C:\\some_made_up_folder')
>>> os.path.isdir('C:\\Windows\\System32')
>>> os.path.isfile('C:\\Windows\\System32')
>>> os.path.isdir('C:\\Windows\\System32\\calc.exe')
>>> os.path.isfile('C:\\Windows\\System32\\calc.exe')

>>> os.path.exists('D:\\')
  • The File Reading/Writing Process
>>> helloFile = open('C:\\Users\\your_home_folder\\hello.txt')

>>> helloContent = helloFile.read()
>>> helloContent
'Hello world!'

>>> sonnetFile = open('sonnet29.txt')
>>> sonnetFile.readlines()
[When, in disgrace with fortune and men's eyes,\n', ' I all alone beweep my
outcast state,\n', And trouble deaf heaven with my bootless cries,\n', And
look upon myself and curse my fate,']
  • Writing to Files
>>> baconFile = open('bacon.txt', 'w')  # 'w' mode overwrites
>>> baconFile.write('Hello world!\n')
>>> baconFile.close()
>>> baconFile = open('bacon.txt', 'a')  # 'a' mode appends at the next line
>>> baconFile.write('Bacon is not a vegetable.')
>>> baconFile.close()
>>> baconFile = open('bacon.txt')
>>> content = baconFile.read()
>>> baconFile.close()
>>> print(content)
Hello world!
Bacon is not a vegetable.
  • Saving Variables with the shelve Module

You can save variables in your Python programs to binary shelf files using the shelve module. This way, your program can restore data to variables from the hard drive. The shelve module will let you add Save and Open features to your program.

>>> import shelve
>>> shelfFile = shelve.open('mydata')
>>> cats = ['Zophie', 'Pooka', 'Simon']
>>> shelfFile['cats'] = cats
>>> shelfFile.close()

>>> shelfFile = shelve.open('mydata')
>>> type(shelfFile)
<class 'shelve.DbfilenameShelf'>
>>> shelfFile['cats']
['Zophie', 'Pooka', 'Simon']
>>> shelfFile.close()

>>> shelfFile = shelve.open('mydata')
>>> list(shelfFile.keys())
>>> list(shelfFile.values())
[['Zophie', 'Pooka', 'Simon']]
>>> shelfFile.close()
  • Saving Variables with the pprint.pformat() Function
>>> import pprint
>>> cats = [{'name': 'Zophie', 'desc': 'chubby'}, {'name': 'Pooka', 'desc': 'fluffy'}]
>>> pprint.pformat(cats)
"[{'desc': 'chubby', 'name': 'Zophie'}, {'desc': 'fluffy', 'name': 'Pooka'}]"
>>> fileObj = open('myCats.py', 'w')
>>> fileObj.write('cats = ' + pprint.pformat(cats) + '\n')
>>> fileObj.close()
  • The shutil Module

The shutil (or shell utilities) module has functions to let you copy, move, rename, and delete files in your Python programs. To use the shutil functions, you will first need to use import shutil.

>>> import shutil, os
>>> os.chdir('C:\\')
>>> shutil.copy('C:\\spam.txt', 'C:\\delicious')
>>> shutil.copy('eggs.txt', 'C:\\delicious\\eggs2.txt')

While shutil.copy() will copy a single file, shutil.copytree() will copy an entire folder and every folder and file contained in it. Calling shutil.copytree(source, destination) will copy the folder at the path source, along with all of its files and subfolders, to the folder at the path destination. The source and destination parameters are both strings. The function returns a string of the path of the copied folder.

>>> import shutil, os
>>> os.chdir('C:\\')
>>> shutil.copytree('C:\\bacon', 'C:\\bacon_backup')
  • Moving and Renaming Files and Folders
>>> import shutil
>>> shutil.move('C:\\bacon.txt', 'C:\\eggs')
>>> shutil.move('C:\\bacon.txt', 'C:\\eggs\\new_bacon.txt')

This line says, “Move C:\bacon.txt into the folder C:\eggs, and while you’re at it, rename that bacon.txt file to new_bacon.txt.”

>>> shutil.move('C:\\bacon.txt', 'C:\\eggs')

Here, if move() can’t find a folder named eggs in the C:\ directory,it assumes that destination must be specifying a filename, not a folder. So the bacon.txt text file is renamed to eggs (a text file without the .txt file extension)—probably not what you wanted!

Finally, the folders that make up the destination must already exist, or else Python will throw an exception.

>>> shutil.move('spam.txt', 'c:\\does_not_exist\\eggs\\ham')
Traceback (most recent call last):
  File "C:\Python34\lib\shutil.py", line 521, in move
    os.rename(src, real_dst)
FileNotFoundError: [WinError 3] The system cannot find the path specified:
'spam.txt' -> 'c:\\does_not_exist\\eggs\\ham'
  • Safe Deletes with the send2trash Module
>>> import send2trash
>>> baconFile = open('bacon.txt', 'a') # creates the file
>>> baconFile.write('Bacon is not a vegetable.')
>>> baconFile.close()
>>> send2trash.send2trash('bacon.txt')
  • Compressing Files with the zipfile Module
>>> import zipfile, os
>>> os.chdir('C:\\')    # move to the folder with example.zip
>>> exampleZip = zipfile.ZipFile('example.zip')
>>> exampleZip.namelist()
['spam.txt', 'cats/', 'cats/catnames.txt', 'cats/zophie.jpg']
>>> spamInfo = exampleZip.getinfo('spam.txt')
>>> spamInfo.file_size
>>> spamInfo.compress_size
>>> 'Compressed file is %sx smaller!' % (round(spamInfo.file_size / spamInfo
.compress_size, 2))
'Compressed file is 3.63x smaller!'
>>> exampleZip.close()
  • Extracting from ZIP Files
>>> import zipfile, os
>>> os.chdir('C:\\')    # move to the folder with example.zip
>>> exampleZip = zipfile.ZipFile('example.zip')
>>> exampleZip.extractall()
>>> exampleZi
  • Creating and Adding to ZIP Files
>>> import zipfile
>>> newZip = zipfile.ZipFile('new.zip', 'w')
>>> newZip.write('spam.txt', compress_type=zipfile.ZIP_DEFLATED)
>>> newZip.close()
  • Getting the Traceback as a String
>>> import traceback
>>> try:
         raise Exception('This is the error message.')
         errorFile = open('errorInfo.txt', 'w')
         print('The traceback info was written to errorInfo.txt.')

The traceback info was written to errorInfo.txt.
  • Assertions

An assertion is a sanity check to make sure your code isn’t doing something obviously wrong. These sanity checks are performed by assert statements. If the sanity check fails, then an AssertionError exception is raised. In code, an assert statement consists of the following:

The assert keyword

A condition (that is, an expression that evaluates to True or False)

A comma

A string to display when the condition is False

>>> podBayDoorStatus = 'open'
>>> assert podBayDoorStatus == 'open', 'The pod bay doors need to be "open".'
>>> podBayDoorStatus = 'I\'m sorry, Dave. I\'m afraid I can\'t do that.'
>>> assert podBayDoorStatus == 'open', 'The pod bay doors need to be "open".'
Traceback (most recent call last):
  File "<pyshell#10>", line 1, in <module>
    assert podBayDoorStatus == 'open', 'The pod bay doors need to be "open".'
AssertionError: The pod bay doors need to be "open".
  • Using the logging Module

To enable the logging module to display log messages on your screen as your program runs, copy the following to the top of your program (but under the #! python shebang line):

import logging
logging.basicConfig(level=logging.DEBUG, format=' %(asctime)s - %(levelname)s
- %(message)s')
  • Logging to a File
import logging
logging.basicConfig(filename='myProgramLog.txt', level=logging.DEBUG, format='
%(asctime)s - %(levelname)s - %(message)s')

프로그램 예제

  • Walking a Directory Tree
import os

for folderName, subfolders, filenames in os.walk('C:\\delicious'):
    print('The current folder is ' + folderName)

    for subfolder in subfolders:
        print('SUBFOLDER OF ' + folderName + ': ' + subfolder)
    for filename in filenames:
        print('FILE INSIDE ' + folderName + ': '+ filename)

  • Raising exceptions
def boxPrint(symbol, width, height):
    if len(symbol) != 1:
        raise Exception('Symbol must be a single character string.')
    if width <= 2:
        raise Exception('Width must be greater than 2.')
    if height <= 2:
        raise Exception('Height must be greater than 2.')
    print(symbol * width)
    for i in range(height - 2):
        print(symbol + (' ' * (width - 2)) + symbol)
    print(symbol * width)

for sym, w, h in (('*', 4, 4), ('O', 20, 5), ('x', 1, 3), ('ZZ', 3, 3)):
        boxPrint(sym, w, h)
    except Exception as err:
        print('An exception happened: ' + str(err))
  • Using Logging module
import logging
logging.basicConfig(level=logging.DEBUG, format=' %(asctime)s - %(levelname)s
- %(message)s')
logging.debug('Start of program')

def factorial(n):
    logging.debug('Start of factorial(%s)' % (n))
    total = 1
    for i in range(n + 1):
        total *= i
        logging.debug('i is ' + str(i) + ', total is ' + str(total))
    logging.debug('End of factorial(%s)' % (n))
    return total

logging.debug('End of program')