PermissionError: [WinError 32] when using openpyxl



我正试图移动一些属于C:/Users/computer/Desktop/file/cities的excel文件,这些文件的名称在这个excel文件cities.xlsx中匹配。然而,我使用空闲打开engine = 'openpyxl'的excel文件,我猜openpyxl导致一些问题。下面我分享完整的代码

import os
import pandas as pd
def fil(st):
t = st.split('(')[0]
t = t.replace(' ','')
if 'ö' in t.lower():
t = t.replace('ö','o')
if 'ü' in t.lower():
t = t.replace('ü','u')

return t
df = pd.read_excel('eyalet2.xlsx',engine = 'openpyxl')
df.fillna('',inplace = True)
for col in df.columns:
df[col] = df[col].map(fil)

def c():
dire = os.getcwd()
for filename in os.listdir(dire):
fn = os.path.join(dire,filename)
if os.path.splitext(fn)[1] == '':
os.chdir(fn)
for ex in os.listdir(os.getcwd()):
yield os.path.splitext(ex)[0]
olan = str()
fk = df.copy()
for cit in c():
for col in df.columns:
filt = df[col].isin([cit])
if df.loc[filt,col].shape[0] >= 1:
olan += f'{cit},'

for st in olan.split(','):
for fl in os.listdir(os.getcwd()):
if st in fl:
os.replace('C:/Users/niimet/Desktop/file/cities',
f'C:/Users/niimet/Desktop/cities2/{st}.xlsx')  

我试图将excel文件从cities移动到cities2,但是发生不相关的错误。因为我从来没有打开Aachen.xlsx文件。在这里我分享这个错误。在最后一个for循环中发生错误。

PermissionError: [WinError 32]进程无法访问文件因为它正在被另一个进程使用:"C:/用户/计算机/桌面/文件/城市→"C:/用户/计算机/桌面/cities2/Aachen.xlsx">

这是一个重写的代码,有更好的函数名,没有相对路径逻辑。

我不知道它是否完全正确,但在你用os.rename()替换最后一个print()之前,它不会做任何破坏性的事情。

import os
import pandas as pd

def filter_string(st):
t = st.split("(")[0]
t = t.replace(" ", "")
t = t.replace("ö", "o")
t = t.replace("ü", "u")
return t

def get_eyalet_df():
df = pd.read_excel("eyalet2.xlsx", engine="openpyxl")
df.fillna("", inplace=True)
for col in df.columns:
df[col] = df[col].map(filter_string)
return df

def find_file_stems(root):
for dirpath, dirnames, filenames in os.walk(root):
for filename in filenames:
yield os.path.splitext(filename)[0]

def main():
root = os.getcwd()
df = get_eyalet_df()
olan = set()
for cit in find_file_stems(root):
for col in df.columns:
filt = df[col].isin([cit])
if df.loc[filt, col].shape[0] >= 1:
olan.add(cit)
for filename in os.listdir(root):
if any(fragment in filename for fragment in olan):
source_path = os.path.join(root, filename)
dest_path = os.path.join("C:/Users/niimet/Desktop/cities2", filename)
print(source_path, dest_path)
# call os.rename(source_path, dest_path) if this seems correct

if __name__ == "__main__":
main()

最新更新