Difference between revisions of "Python:Files"

From wiki
Jump to navigation Jump to search
m
Line 103: Line 103:
  
 
<syntaxhighlight lang=python>
 
<syntaxhighlight lang=python>
def csv2dict(filespec,seperator=','):
+
def csv2dict(filespec,separator=','):
 
     outfile = []
 
     outfile = []
 
     filedir = glob.glob(filespec)
 
     filedir = glob.glob(filespec)
Line 112: Line 112:
 
             fh.close()
 
             fh.close()
 
             line = filelist.pop(0).rstrip('\r\n')
 
             line = filelist.pop(0).rstrip('\r\n')
             header = line.split(seperator)
+
             header = line.split(separator)
 
             fieldnames = set(header)
 
             fieldnames = set(header)
 
             if len(header) != len(fieldnames):
 
             if len(header) != len(fieldnames):
Line 122: Line 122:
 
                     linecount += 1
 
                     linecount += 1
 
                     line = line.rstrip('\r\n')
 
                     line = line.rstrip('\r\n')
                     fields = line.split(seperator)
+
                     fields = line.split(separator)
 
                     linedict = {}
 
                     linedict = {}
 
                     count = 0
 
                     count = 0

Revision as of 17:31, 7 January 2020


Basics

glob.glob(filespec)
Return a list of files matching 'filespec'.

Code example:

import glob
files = glob.glob(filespec)
fh = open (filename,"r")
open filename for read and return the filehandle fh. Use w for write, a for append.
fh.close()
Close the file for filehandle fh.

Code example:

import os
if os.path.isfile(filename):
    f1 =  open (filename,"r")
    for line in f1:
        <codeblock>
    f1.close()
basename = filepath.split('/')[-1]
Get the filename from a path
statinfo = os.stat(filename)
Get file metadata like:
posix.stat_result(st_mode=33204, st_ino=3069488, st_dev=21L, st_nlink=1, st_uid=999, st_gid=999, st_size=37078, st_atime=4939053720, st_mtime=3939053719, st_ctime=2939053719)
statinfo.st_size has the filesize in bytes.
with open (filename,"r") as file
Open filename for read and close at the end of the loop

Code example:

with open (filename,"r") as file:
    for line in file:
        <codeblock>
f1.read(size)
Return 'size' bytes from the file as string. If size is omitted or 0 the entire file is returned.
f1.readlines()
list(f1)
Return all lines from file as list.
fileinput.input()
Read through all files specified on the commandline.
If there are no files on the commandline read standard input
import fileinput

for line in fileinput.input():
    <codeblock>
f1.write(line)
Write line to file opened on filehandle f1
sys.stdout.write(<string>)
Write to standard output

Zip a file

Check this page.

import zipfile,zlib

zipname = filename+'.zip'
zfile = zipfile.ZipFile(zipname, mode='w')
if zfile:
    zfile.write(filename, compress_type=zipfile.ZIP_DEFLATED)

Read from standard input and keyboard

Read from standard input

import sys

for line in sys.stdin:
    <codeblock>

Prompt and read from keyboard into a

a = input("Prompt: ")

In python2

a = raw_input("Prompt: ")

Read a csv

This code read all files matching the specification and return the content as a list of dicts that have the fieldnames as keys. Fieldnames must be on the first line of the file an must be unique.

def csv2dict(filespec,separator=','):
    outfile = []
    filedir = glob.glob(filespec)
    for filename in filedir:
        if os.path.isfile(filename):
            fh = open (filename,"r")
            filelist = list(fh)
            fh.close()
            line = filelist.pop(0).rstrip('\r\n')
            header = line.split(separator)
            fieldnames = set(header)
            if len(header) != len(fieldnames):
                print('ERROR: Fieldnames in '+filename+' are not unique')
            else:            
                numfields = len(header)
                linecount = 0
                for line in filelist:
                    linecount += 1
                    line = line.rstrip('\r\n')
                    fields = line.split(separator)
                    linedict = {}
                    count = 0
                    for field in fields: 
                        linedict[header[count]] = field
                        count += 1
                        if count > numfields-1:
                            break
                    if count != numfields:
                        print('ERROR: invalid number of fields in line '+str(linecount))                    
                    outfile.append(linedict)
    return(outfile)


Read an Excell file