我正试图移动一些属于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()