 Computer Science

# Types and Files

## Types

• every variable has a type
• types are figured out for you by Python
``````student = "Emma"
age = 7`````` ### Operations depend on the variable type

``````age = 7
student = 'Emma'

print(age + age)
print(student + student)``````
``````    14
EmmaEmma``````

### If you think you have an integer but actually have a string…

``````age = '7'
print(age + age)``````
``    77``

### If you have a string but wish you had an integer…

``````age = '7'
print(age + age)``````
``    77``

Reminder: convert the string to an integer using `int()`

``````age_converted_to_integer = int(age)
print(age_converted_to_integer + age_converted_to_integer)``````
``    14``
``````age = int(age)
print(age + age)
``````
``    14``

### If you have an integer but wish you had a string…

``````score = 10
output = "score: "
output += score``````
``````    ---------------------------------------------------------------------------

TypeError                                 Traceback (most recent call last)

/var/folders/9x/cb134v3d2nb22_rksynbspqm0000gn/T/ipykernel_12650/4122253352.py in <module>
1 score = 10
2 output = "score: "
----> 3 output += score

TypeError: can only concatenate str (not "int") to str``````

Reminder: convert the integer to a string using `str()`

``````score = str(score)
output += score
print(output)``````
``    score: 10``

### example: `sum_digits(s)`

• sum all the digits in a string
``````def sum_digits(s):
# use the accumulator pattern
sum = 0
# loop over all the digits
for i in range(len(s)):
if s[i].isdigit():
sum += int(s[i])
return sum

sum_digits('abc4d5e10')``````
``    10``
``````def sum_contiguous_digits(s):
# use the accumulator pattern
sum = 0
substring = ''
# loop over all the digits
for i in range(len(s)):
if s[i].isdigit():
substring += s[i]
print(i,s[i],"this is a digit, so add it to substring")
elif len(substring) > 0:
print(i,s[i],"this is not a digit, so convert substring to an int", substring)
sum += int(substring)
substring = ''
if len(substring) > 0:
sum += int(substring)
return sum

sum_contiguous_digits('abc45e10')``````
``````    3 4 this is a digit, so add it to substring
4 5 this is a digit, so add it to substring
5 e this is not a digit, so convert substring to an int 45
6 1 this is a digit, so add it to substring
7 0 this is a digit, so add it to substring

55``````

### for character in

• all this time we have been using
``````for i in range(len(s)):
# do something with character s``````
• we could be using
``````for character in s:
# do something with character s``````

### example: `sum_digits(s)` — using for character in

``````def sum_digits(s):
# use the accumulator pattern
sum = 0
# loop over all the digits
for character in s:
if character.isdigit():
sum += int(character)
return sum

sum_digits('abc4d5e10')``````
``    10``

### example: `right_left(s)`

• take a string, cut it in half (right half and left half)

• make a new string that has “rightrightleftleft”

• ‘aabb’ -> ‘bbbbaaaa’

### finding the middle of a string

``````s = 'aabb'
middle = len(s) / 2
print(middle)
s[middle]``````
``````    2.0

---------------------------------------------------------------------------

TypeError                                 Traceback (most recent call last)

/var/folders/9x/cb134v3d2nb22_rksynbspqm0000gn/T/ipykernel_12650/1260919677.py in <module>
2 middle = len(s) / 2
3 print(middle)
----> 4 s[middle]
5
6

TypeError: string indices must be integers``````

### integer division

``````s = 'aabb'
middle = len(s) // 2
print(middle)
s[middle]``````
``````    2

'b'``````
``````def right_left(s):
middle = len(s) // 2
left = s[:middle]
right = s[middle:]
return right + right + left + left

right_left('aabb')
right_left('aabbb')``````
``    'bbbbbbaaaa'``

### modular division

``23 % 10``
``    3``
``36 % 10``
``    6``
``17 % 5``
``    2``
``45 % 5``
``    0``

### example: `crazy_str(s)`

• first letter lowercase, second uppercase, and then continue alternating lowercase and uppercase
``````def crazy_str(s):
# accumulator pattern
result = ''
for i in range(len(s)):
if i % 2 == 0:
# even number
result += s[i].lower()
else:
# odd number
result += s[i].upper()
return result

crazy_str('WHAT is going on?')``````
``    'wHaT Is gOiNg oN?'``

## Files

• each file is a set of lines

• each line is a sequence of characters

• every line ends with a newline character ‘\n’ (same as hitting Return or Enter on keyboard)

• create a file called hibye.txt:

``````Hi and↩️
Bye↩️``````

### A file is just a long string

• if you could read the entire file into a single string, it would look like this:
``file_contents = "Hi and\nBye\n"``
• each `\n` represents a newline character

### Actually, this is easy to do

``````# open a file for reading
file = open('hibye.txt')
# the variable "file" is a file, just like "bit" was a bit and "image" was an image
contents``````
``    'Hi and\nBye\n'``

### Reading a file line by line

``````# in this block of code, set the variable 'file' to the file that is named 'hibye.txt'
with open('hibye.txt') as file:
# loop over all lines in a file
# looks a lot like "for pixel in image" and "for character in string"
count = 0
for line in file:
# use line in here
if count == 0:
print(line)
count += 1
``````    Hi and

### why are there extra newlines?

• the first line is `Hi and\n`
• when you `print('Hi and\n')`, you get a newline from the string, and then print adds an extra newline

### `strip()`

• removes both leading and trailing whitespace characters in a string
• one of the most helpful functions you will use with files!
``````s = "Apples and\n"
print(s.strip())

word = " \t  bananas   \n "
print(word.strip())``````

Apples and bananas

``````with open('hibye.txt') as file:
for line in file:
# remove whitespace
print(line.strip())``````
``````    Hi and
Bye``````

### carriage returns and newlines

• MacOS ends lines with `\n` — newline character

• Windows ends lines with `\r\n` — carriage return character and newline character

• newline is also called line feed

• `\r\n` is called CRLF (carriage return line feed)

• carriage return returns to the beginning of the current line, line feed moves to the next line)

### Python handles this for you

• when you use `for line in file`, Python automatically detects both `\n` and `\r\n`

### remember `crazy_str(s)`?

``````with open('hibye.txt') as file:
for line in file:
# change the line into a crazy string
crazy_line = crazy_str(line)
# don't print anything at the end of the line
print(crazy_line, end='')``````
``````    hI AnD
bYe``````