#python #zipfile
#python #python-zipfile
Вопрос:
Я пытаюсь заменить определенную строку внутри файлов, которые находятся внутри zip-файла (и сохранить структуру zip-папок и другие файлы без изменений), используя следующий код python, но я продолжаю получать ошибки, такие как: FileNotFoundError: [WinError 3] Система не может найти указанный путь:
Я все еще изучаю Python, так что нет, я пока понятия не имею, что не так
У кого-нибудь есть идеи? Спасибо!
import zipfile
srcfile='test.zip'
dstfile='test2.zip'
with zipfile.ZipFile(srcfile) as inzip, zipfile.ZipFile(dstfile, "w") as outzip:
for inzipinfo in inzip.infolist():
with inzip.open(inzipinfo) as infile:
if inzipinfo.filename.endswith('/') == False:
if inzipinfo.filename.find("code.sas")>=0:
print(inzipinfo.filename)
content = infile.read()
content = content.replace("foo", "bar")
outzip.writestr(inzipinfo.filename, content)
else:
content = infile.read()
outzip.write(inzipinfo.filename, content) #FileNotFoundError: [WinError 3]
Редактировать:
Сделано на C #, намного проще
csc.exe /предпочитаемый язык: en-US /цель: exe /reference:System.IO.Compression.dll /reference:System.IO.dll /ссылка:System.IO.Compression.FileSystem.dll /out:program.exe program.cs программа.cs
using System.IO.Compression;
using System.IO;
namespace ReplaceZipString
{
class Program
{
static string tmpfolder = @"tmp";
static void Main(string[] args)
{
string indir = @"indir";
foreach (string infile in Directory.GetFiles(indir, "*.zip"))
{
DoFile(infile);
}
}
private static void DoFile(string infile)
{
string outfile = infile;
if (Directory.Exists(tmpfolder)) Directory.Delete(tmpfolder, true);
ZipArchive inzip = ZipFile.OpenRead(infile);
inzip.ExtractToDirectory(tmpfolder);
inzip.Dispose();
DirectoryInfo di = new DirectoryInfo(tmpfolder);
foreach (FileInfo f in di.EnumerateFiles("code.sas", SearchOption.AllDirectories))
{
string text = File.ReadAllText(f.FullName, System.Text.Encoding.Default);
text = text.Replace("foo", "bar");
File.WriteAllText(f.FullName, text, System.Text.Encoding.Default);
}
if (File.Exists(outfile)) File.Delete(outfile);
ZipFile.CreateFromDirectory(tmpfolder, outfile);
}
}
}
Ответ №1:
Внес несколько изменений, это работает для меня
import zipfile
srcfile = '..tmp//test.zip'
dstfile = '..tmp//test_out.zip'
inzip = zipfile.ZipFile(srcfile, 'r')
outzip = zipfile.ZipFile(dstfile, "w")
# Iterate the input files
for inzipinfo in inzip.infolist():
print(inzipinfo)
# Read input file
infile = inzip.open(inzipinfo)
if inzipinfo.filename == "test.txt":
content = infile.read()
new_content = str(content, 'utf-8').replace("abc", "123")
# Write content
outzip.writestr(inzipinfo.filename, new_content)
else: # Other file, dont want to modify => just copy it
content = infile.read()
outzip.writestr(inzipinfo.filename, content)
inzip.close()
outzip.close()