'How do I extract and process all the files in a zipfile?
I want to extract and process all the files in a zipped file?
import re
import zipfile
import pathlib
import pandas as pd
# Download mHealth dataset
def parse(zip_file):
# Extract all the files in output directory
with zipfile.ZipFile(zip_file, "r") as zfile:
for file in zfile.extractall():
if file.is_file():
old_name = file.stem
extension = file.suffix
directory = file.parent
new_name = re.sub("mHealth_", "", old_name) + extension
file = file.rename(pathlib.Path(directory, new_name))
zfile.close()
return file
Traceback error:
Traceback (most recent call last):
File "C:\Users\User\PycharmProjects\algorithms\project_kmeans.py", line 47,
in <module>
df_ = parse(zip_file_) File "C:\Users\User\PycharmProjects\algorithms\project_kmeans.py", line 12,
in parse
for file in zfile.extractall(): TypeError: 'NoneType' object is not iterable
Process finished with exit code 1
Solution 1:[1]
You need infolist() or namelist() instead of extractall() to work with for-loop.
extractall() extracts files from zip but it doesn't give file names - so it can't be used with for-loop.
infolist() or namelist() gives file names but it makes other problem because it gives object ZipInfo or string, not Path, so it doesn't have .is_file, .stem, etc. You would have to convert to Path.
import zipfile
import pathlib
import pandas as pd
# Download mHealth dataset
def parse(zip_file):
results = []
# Extract all the files in output directory
with zipfile.ZipFile(zip_file, "r") as zfile:
zfile.extractall() # extract
#for filename in zfile.namelist():
# path = pathlib.Path(filename)
for fileinfo in zfile.infolist():
filename = fileinfo.filename
path = pathlib.Path(filename)
if path.is_file():
old_name = path.stem
extension = path.suffix
directory = path.parent
new_name = old_name.replace("mHealth_", "") + extension
path = path.rename(pathlib.Path(directory, new_name))
print('path:', path)
results.append([filename, new_name])
df = pd.DataFrame(results, columns=['old', 'new'])
return df
df = parse('test.zip')
print(df)
Doc: infolist and extractall
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 |
