赞
踩
目录
2 用VBA 实现 遍历文件夹,读取文件内容,写入文件内容等
2.1.2 用VBA取得文件名等需要使用 dir mkdir 等类dos的命令
2.1.4 用open语句 打开,close语句 关闭文件:
2.1.5.1 打开文件夹,把文件夹内的文件名,输出到另外一个txt文件内
对应代码:可看出,input 和 line input语句效果一样,匪夷所思
对应代码:可看出,input() 函数可实现读取指定长度的内容
2.6 向新建文件夹内的新文件输出(先判断是否存在此文件夹)
3 VBA 其他操作文件方法,比如fso的简要了解(未完善,需要整理)
4.3.1 打开文件方式1:使用 open() 函数打开,file=open()
4.3.2 打开文件方式2: 使用with语句+打开, 就是 with + 文件对象
4.5.1 读入内容方法1, file.read()整体读入
4.5.2 读入内容方法1, file.readlines()整体读入,并且直接返回的是列表
4.5.3 读入内容方法3: for line in file 逐行读入
4.5.4 读入内容方法4: file.readline()逐行读入
5.3 比较 VBA 和 python 文件处理的相关代码差别
5.3.1 VBA的内嵌EXCEL天生优势 VS python的各种import模块
5.3.2 VBA里还有很多语句式的命令,python里基本都是函数了
放在第一篇需要先明确下目的
为什么要做这个系列
文件操作函数或者语句,类DOS
- dir: dir(path1) 和 继续 dir()
- mkdir:MkDir (path1) 创建文件/文件夹
- CurDir :CurDir() 函数
- ChDir :ChDir path 语句
- ChDrive: 语句
- Sub testp1()
- Debug.Print CurDir()
-
- Debug.Print Dir("C:\Users\Administrator\Desktop\ptest1.txt")
-
- ChDir "d:\123"
- Debug.Print CurDir()
-
- ChDrive "d:\"
- Debug.Print CurDir()
-
- ChDrive "c:\"
- Debug.Print CurDir()
-
- ChDir "C:\Users\Administrator\Desktop"
- Debug.Print CurDir()
- End Sub
总结dir()的特点
- 参数
- dir(path=文件路径) ,可以直接返回文件名,返回文件名.后缀
- dir(path=文件夹路径) 其中参数path 可以是文件夹,必须有\*.*这一级,否则取不到文件夹内的内容返回文件夹内的第一个文件名.后缀
- 比如fp = "C:\Users\Administrator\Desktop\ppp\*.txt"
- dir() 也可以不带参数的,但是需要配合 dir(path文件夹) 使用,dir(path) 配合 dir() 使用
- 会接着显示当前文件夹当前指针后面的文件名,可以逐个显示文件夹内的文件名,但是排序是 1.txt 10.xtxt 2.txt 这样的次序
- 返回值
- dir(path) 的返回值,一定是文件名.后缀格式名(非绝对路径)
吐槽:open path for mode as # 居然没有一个支持既可读又可写的模式。。。。不可想象,要想又读又写,只能分开!
官方解释
Open pathname For mode [Access access] [lock] As [#] filenumber [Len = reclength]
参数:
1)pathname 必填。 指定文件名的字符串表达式,可包括目录或文件夹和驱动器。
2)mode 必填。 指定文件模式的关键字:Append、Binary、Input、Output 或 Random。 如果未指定,则以 Random 访问模式打开文件。
- Input:以输入方式打开,即读取方式。
- Output:以输出方式打开,即写入方式。
- Append:以追加方式打开,即添加内容到文件末尾。
- Binary:以二进制方式打开。
- Random:以随机方式打开,如果未指定方式,则以 Random 方式打开文件。
3)access 可选。 指定可对打开的文件执行的操作的关键字:Read、Write 或 Read Write。
4)lock 可选。 指定由其他进程限制在打开的文件上的操作的关键字:共享、锁定读取、锁定写入和锁定读写。
5)filenumber 必填。 一个有效文件号,范围为1到511(含1和511)。 使用FreeFile 函数可获取下一个可用的文件编号。
6)reclength 可选。 小于或等于 32,767(字节)的数。 对于以随机访问模式打开的文件,此值为记录长度。 对于序列文件,此值为缓冲的字符数。
如果pathname指定的文件不存在,那么在以 Append、Binary、Output 或 Random 模式打开文件时,即会创建它。
如果文件已由另一个进程打开,并且不允许指定的访问类型,则打开操作将失败,并将发生错误。
如果mode为Binary,则忽略Len子句。
在Binary,Input,Random模式中,你可以使用不同的文件号打开文件,而无需先关闭文件。 在 Append 和 Output 模式中,必须先关闭该文件,然后才能用不同文件号打开它。
- '指定读取文件夹的路径内的 多个文字名字
- Sub print1001()
-
- '指定输出路径
- path1 = "C:\Users\Administrator\Desktop\ptest1.txt"
-
- fp = "C:\Users\Administrator\Desktop\ppp\*.*"
- fn = Dir(fp)
-
- '打印文件夹内的文件名
- Do While fn <> ""
- 'VBE调试窗口输出
- Debug.Print fn
-
- '向文件输出
- Open path1 For Append As #2
- Print #2, fn
- Close #2
- fn = Dir
- Loop
- Debug.Print "文件夹内的文件名已经遍历完毕,并且已经追加写入了" & path1 & "内"
- MsgBox ("文件夹内的文件名已经遍历完毕,并且已经追加写入了" & path1 & "内")
- End Sub
-
-
- 'dir总结
- '总结1:'dir 后面只能用dir,不能 Dir(fp)否则会重置会第一个文件名
- '总结2:'dir获得是文件名,(包含文件名=后缀)像这种 ppp1.txt,但是不包含完整路径
- '总结3:循环dir,会导致ppp1 ppp10 ppp2.txt这种文件名排序,需要注意不是按数字排序的
- '总结4:'文件如果没有会自动创建, output, input
- 'Append、Binary、Input、Output 或 Random。 如果未指定,则以 Random 访问模式打开文件。
-
- '打开文件:open 完整路径 for input/output/append as #别名
- '关闭文件:close #别名
- '写入文件内容: print
- Sub test205()
- '指定输出路径
- path1 = "C:\Users\Administrator\Desktop\ptest1.txt"
-
- fp = "C:\Users\Administrator\Desktop\ppp\*.txt" '必须有\*.*这一级,否则取不到文件夹内的内容
- fn = Dir(fp)
-
- Open path1 For Output As #2
- '打印文件夹内的文件名
- Do While fn <> ""
- 'VBE调试窗口输出
- Debug.Print fn
- '向文件输出
- Print #2, fn
- fn = Dir
- Loop
- Close #2
- End Sub
可以参考我自己之前写的一篇文章
line input可直接识别 | line input不可识别 但是可以通过split()分行 | ||
文件分多行 | 文件分多行 | 文件内未分行 | |
input | 只能读到第1行 | 只能读到第1行 | 全部内容读成为1行 |
line input不可识别的多行 | 全部内容读成为1行 | 全部内容读成为1行 | 全部内容读成为1行 |
line input可识别的多行 | 读成为多行 | 全部内容读成为1行 | 全部内容读成为1行 |
line input+split()可处理的多行 | 读成为多行 | 读成为多行 | 全部内容读成为1行 |
要读到文件夹内容
- Sub test206()
- '指定输出路径
- path1 = "C:\Users\Administrator\Desktop\ptest1.txt"
- Open path1 For Input As #2
- '打印文件夹内的文件名
- Do While Not EOF(2)
- '从文件内读入
- Input #2, curr1
- Debug.Print "Input #2, curr1=" & curr1
-
- Line Input #2, curr1
- Debug.Print "Line Input #2, curr1=" & curr1
- Loop
- Close #2
- End Sub
- Sub test207()
- '指定输出路径
- path1 = "C:\Users\Administrator\Desktop\ptest1.txt"
- Open path1 For Input As #2
- '打印文件夹内的文件名
- Do While Not EOF(2)
- '从文件内读入
- curr1 = Input(LOF(2), #2)
- Debug.Print " curr1 = input(LOF(2), #2)" & curr1
- Loop
- Close #2
- End Sub
例子
- Sub test2207() '尝试把文件内容已经分行,但是line input 无法直接识别的内容,变为分行后读入
-
- Dim sh1 As Object
- fnum = FreeFile
- Set sh1 = ThisWorkbook.Worksheets("a")
- m = 1
- Open "C:\Users\Administrator\Desktop\k\62" For Input As #fnum
- Do While Not EOF(fnum)
- Line Input #fnum, aaa1
- lll1 = Split(aaa1, Chr(10)) 'split()返回一个数组,以chr(10)为间隔分行
- ' For i = 0 To UBound(lll1) Step 1 'split()返回一个数组,index从0开始,千万别写成1,会少1个数据
- For i = LBound(lll1) To UBound(lll1) Step 1
- Debug.Print lll1(i)
- sh1.Cells(m, 2) = lll1(i)
- m = m + 1
- Next
-
- Loop
- Debug.Print "test207结束"
- Close fnum
-
-
- End Sub
写入文件内容的语句:
函数
- Sub test208()
- '指定输出路径
- path1 = "C:\Users\Administrator\Desktop\ptest1.txt"
- Open path1 For Append As #2
- Print #2, "ok1"
- Print #2, "OK2"
- Write #2, "ok1"
- Write #2, "ok1" & "OK2"
-
- ' Print (#2,"你好")
- ' write (#2,"你好")
-
- Close #2
- End Sub
- '读取文件夹内的每个文件内容到另外一个指定的txt里
- Sub print1002()
- '指定输出路径
- path1 = "C:\Users\Administrator\Desktop\ptest1.txt"
-
- '指定读取文件夹的路径
- fp = "C:\Users\Administrator\Desktop\ppp\*.*"
- fn = Dir(fp)
- path2 = "C:\Users\Administrator\Desktop\ppp"
-
-
- '打印文件夹内的文件名
- Open path1 For Append As #2
- Do While fn <> ""
- 'VBE调试窗口输出
- Debug.Print fn
-
- '向文件输出
- path3 = path2 & "\" & fn
- Open path3 For Input As #1
- Do While Not EOF(1)
- curr1 = input(LOF(1), #1)
- Print #2, curr1
- Loop
- Close #1
- fn = Dir
- Loop
- Close #2
- End Sub
-
- '读取文件,打开时用input即可
- '用lof(别名文件号) 判断长度,可以直接 lof(1)-10 取部分内容
- '用eof(1)判断是否到文件结尾
- '需要input函数,可用变量暂存内容=input(长度,别名)
Input() 函数
- input函数,input(长度,别名)
- Input #1, MyString, MyNumber ' 将数据读入两个变量。
Input() 语句
- 语法:Input #filenumber, varlist
- 功能:从已打开的顺序文件中读出数据并将数据指定给变量。
- 说明:通常用 Write # 将 Input # 语句读出的数据写入文件。为了能够用 Input # 语句将文件的数据正确读入到变量中,在将数据写入文件时,要使用 Write # 语句而不使用 Print # 语句。使用 Write # 语句可以确保将各个单独的数据域正确分隔开。
EOF 函数
- 语法:EOF(filenumber)
- 功能:返回一个 Integer,它包含 Boolean 值 True,表明已经到达为 Random 或顺序 Input 打开的文件的结尾。
LOF 函数
- 语法:LOF(filenumber)
- 功能:返回一个 Long,表示用 Open 语句打开的文件的大小,该大小以字节为单位。
Loc 函数
- 语法:LOc(filenumber)
- 功能:返回一个 Long,在已打开的文件中指定当前读/写位置
-
- '向文件夹内的多个文件输出内容,已有的多个文件,发现几个文件写入几个文件
- Sub print1003()
-
- path1 = "C:\Users\Administrator\Desktop\ppp1"
- fp1 = "C:\Users\Administrator\Desktop\ppp1\*.*"
- fn1 = Dir(fp1)
-
- x = 1
- Do While fn1 <> ""
- path2 = path1 & "\" & fn1
- '向文件输出
- Open path2 For Output As #1
- Print #1, x & "第" & x & "句内容XXX"
- Close #1
- x = x + 1
- fn1 = Dir
- Loop
- End Sub
- '指定要输出到文件夹里的文件个数,一般针对新文件夹,重新创建文件夹和新文件
- Sub print1004()
- '如果已有文件夹里有其他文件夹应该会忽略掉
- path2 = "C:\Users\Administrator\Desktop\ppp2"
-
- y = 1
- For i = 1 To 10
- path6 = path2 & "\" & i & ".txt"
- '向文件输出
- Open path6 For Output As #1
- Print #1, y & "第" & y & "句内容YYYYY"
- Close #1
- y = y + 1
- Next
-
- End Sub
- '指定要输出到文件夹里的文件个数,严谨点先判断是否是空文件夹
- Sub print1005()
- path1 = "C:\Users\Administrator\Desktop\ppp3"
-
- '先判断文件夹是否存在
- If Dir(path1) <> "" Then
- ' MsgBox ("请注意此文件夹已存在,里面可能已经包含其他文件",vbYesNo)
- MsgBox ("请注意此文件夹已存在,里面可能已经包含其他文件")
- Else
- MkDir (path1)
-
- End If
-
- Z = 1
- '因为确定了是新文件夹,肯定是空文件夹了
- For i = 1 To 10
- path7 = path1 & "\" & i & ".txt"
- '向文件输出
- Open path7 For Output As #1
- Print #1, Z & "第" & Z & "句内容ZZZZ"
- Close #1
- Z = Z + 1
- Next
-
-
- End Sub
Set fso = CreateObject("scripting.filesystemobject")
Set f1 = fso.opentextfile(filepath1, 1, True)
Do Until f1.AtEndOfLinereadtext = f1.readline
readtext = f1.readall
f2.write (readtext)
Set fso = CreateObject("scripting.filesystemobject")
Set f2 = fso.opentextfile(filepath2, 2, True)
f2.writeline (readtext)
- Sub test202()
-
- Dim fso As Object
- Dim f1
- Dim filepath1
- Dim i
-
- filepath1 = "C:\Users\Administrator\Desktop\wateranswer.txt"
- filepath2 = "C:\Users\Administrator\Desktop\111.txt"
- Set fso = CreateObject("scripting.filesystemobject")
- Set f1 = fso.opentextfile(filepath1, , , tristate = 1)
- Set f2 = fso.opentextfile(filepath2, 2, True)
-
- i = 1
- readtext = ""
-
-
- Do Until f1.AtEndOfLine
- readtext = f1.readline
- Debug.Print readtext
- ThisWorkbook.Worksheets("sheet1").Cells(i, 1).Value = readtext
-
- f2.writeline (readtext)
-
- i = i + 1
- Loop
-
-
- Debug.Print "读取完成"
- End Sub
readtext = f1.readall
f2.write (readtext)
- Sub test203()
-
- Dim fso As Object
- Dim f1
- Dim filepath1
- Dim i
-
- filepath1 = "C:\Users\Administrator\Desktop\wateranswer.txt"
- filepath2 = "C:\Users\Administrator\Desktop\111.txt"
- Set fso = CreateObject("scripting.filesystemobject")
- Set f1 = fso.opentextfile(filepath1, , , tristate = 1)
- Set f2 = fso.opentextfile(filepath2, 2, True)
-
-
- readtext = f1.readall
- Debug.Print readtext
- f2.write (readtext)
-
-
- Debug.Print "读取完成"
- End Sub
- Sub test204()
-
- Dim fso
- Dim f1
- 'fso对象可以返回文件夹名或者文件名,但是打开文件夹需要用fso.getfolder()方法fso.opentextfile()不同
- Set fso = CreateObject("scripting.filesystemobject")
- Set f1 = fso.getfolder("C:\Users\Administrator\Desktop\ppp")
- Debug.Print f1
- Debug.Print f1.Name
- Debug.Print f1.Files.Count
-
- 'dir 只能返回文件的名字,不能返回文件夹名字
- f2 = Dir("C:\Users\Administrator\Desktop\ppp")
- Debug.Print f2
- 'Debug.Print f2.Name 'f1是fso对象,但是f2不是,f2只是1个变量
-
- f3 = Dir("C:\Users\Administrator\Desktop\ppp\ppp1.txt")
- Debug.Print f3
-
- End Sub
fso的属性
- Sub jackma101()
- Dim path1
- path1 = "C:\Users\Administrator\Desktop\test1"
-
- Call ponyma101(path1)
-
- End Sub
-
-
-
- Function ponyma101(path1)
- ' 先查某类型的文件数量
-
- Dim fso As Object
- Dim fd1 As Object
- Dim f1 As Object
-
-
- Set fso = CreateObject("scripting.filesystemobject")
- Set fd1 = fso.getfolder(path1)
-
- x1 = fd1.Files.Count
- Debug.Print "所有文件数为:" & x1
-
- For Each f1 In fd1.Files
- If fso.getextensionname(path1 & "\" & f1.Name) = "txt" Then
- ' fso.getfile(path1).getextensionname
- ' f1.getextensionname
- '只有一种语法可这么用
- y1 = y1 + 1
- End If
- Next
-
- Debug.Print ".txt文件数为:" & y1
-
- End Function
-
- Sub jackma101()
- Dim path1
- path1 = "C:\Users\Administrator\Desktop\test1"
-
- Call ponyma101(path1)
-
- End Sub
-
-
-
- Function ponyma101(path1)
- ' 先查某类型的文件数量
-
- Dim fso As Object
- Dim fd1 As Object
- Dim f1 As Object
-
-
- Set fso = CreateObject("scripting.filesystemobject")
- Set fd1 = fso.getfolder(path1)
-
- x1 = fd1.Files.Count
- Debug.Print "所有文件数为:" & x1
-
- For Each f1 In fd1.Files
- If f1.Name Like "*.txt" Then
- '只有一种语法可这么用
- ' If fso.getextensionname(path1 & "\" & f1.Name) = "txt" Then
- ' fso.getfile(path1).getextensionname
- ' f1.getextensionname
- y1 = y1 + 1
- End If
- Next
-
- Debug.Print ".txt文件数为:" & y1
-
- End Function
VBA
判断文件是否存在,文件夹是否存在,直接
- if dir(path1)=""
- if dir(path1)=vbNullString
如果是fso这种对象
Set fso = CreateObject("Scripting.FileSystemObject")
If fso.folderExists(strFullPath) Then FileFolderExists = True
Set fso = Nothing
- import copy
- import os
- import xlwt
- import openpyxl
-
- #中间省略了很多代码
-
-
- #从文件夹里逐个读文件,逐个判断,结果输出到EXCEL里
-
- test = Puzzle()
- folder_path=r"C:\Users\Administrator\Desktop\ppp"
- file_names = os.listdir(r"C:\Users\Administrator\Desktop\ppp")
- y=1
-
- with open(r"C:\Users\Administrator\Desktop\wateranswer.txt",'a') as f:
- # 遍历文件名列表,逐个读取文件内容
- for file_name in file_names:
- print(file_name)
-
- file_path = os.path.join(folder_path, file_name) # 应该会自动加\吧
- #if os.path.isfile(file_path):
- test.readfile(file_path)
- test.print()
-
- a = A_star(test)
-
- if a == None:
- print("None!")
- f.write("第%d题无解" %y) #组合参数字符串?
- f.write("\n")
- else:
- print("%d steps"%len(a[0]))
- print(a[0])
- a[1].print()
- f.write("第%d题有解" %y)
- f.write("%d steps"%len(a[0])+"\n")
- f.write(" ".join(str(x) for x in a[0])+"\n") #数组转字符串
- y=y+1
-
path1=r"C:\Users\Administrator\Desktop\ptest1.txt"
with open(path1,"a") as file2:
r | 只读模式,打开一个文件用于读取。如果文件不存在,则会发生错误。 |
w | 写入模式,打开一个文件用于写入。如果文件已经存在,则清空文件内容;如果文件不存在,则创建新文件。 |
a | 追加模式,打开一个文件用于追加内容。如果文件不存在,则创建新文件。 |
x | 创建模式,创建一个新文件用于写入。如果文件已经存在,则会发生错误。 |
b | 二进制模式,用于读取或写入二进制数据。与其他模式配合使用,如rb、wb、ab等。 |
t | 文本模式,默认模式,用于读取或写入文本数据。与其他模式配合使用,如rt、wt、at等。 |
+ | 读写模式,用于既能读取又能写入文件的操作。与其他模式配合使用,如r+、w+、a+等。 |
file3=open(path1,"a")
print(file3)
可以看到会返回这样的一个对象 <_io.TextIOWrapper name='C:\\Users\\Administrator\\Desktop\\ptest1.txt' mode='a' encoding='cp936'>
file3=open(path1,"a+")
file3.seek(0)
content1=file3.read()
print(content1)
file3=open(path1,"a+")
file3.seek(0)
lines=file3.readlines()
print(lines)
print(lines[:3])
file3=open(path1,"a+")
file3.seek(0)
for line in file3:
print(line)
file3=open(path1,"a+")
file3.seek(0)
for line in file3:
print(line)
- import os
- path1=r"C:\Users\Administrator\Desktop\ptest2.txt"
- path2=r"C:\Users\Administrator\Desktop\ppp"
- file_names=os.listdir(path2)
-
- #for file_name in file_names:
- #print(file_name)
-
- with open(path1,"a") as file2: # open必须连着 with open ?
- file2.write("新增一句")
- file2.write("\n")
-
- file3=open(path1,"a+")
- print(file3)
- file3.write("再新增一句")
- file3.write("\n")
-
- file3=open(path1,"a+")
- file3.seek(0)
- content1=file3.read()
- print(content1)
-
- file3=open(path1,"a+")
- file3.seek(0)
- for line in file3:
- print(line)
-
- file3=open(path1,"a+")
- file3.seek(0)
- print(file3.readline())
- print(file3.readline())
- print(file3.readline(2)) #只要这行的前2个字符
-
-
- file3=open(path1,"a+")
- file3.seek(0)
- lines=file3.readlines()
- print(lines)
- print(lines[:3])
- import os
- path1=r"C:\Users\Administrator\Desktop\ptest1.txt"
- path2=r"C:\Users\Administrator\Desktop\ppp"
- #file_names = os.listdir(path2)
- file_names=os.listdir(path2)
-
- for file_name in file_names:
- print(file_name)
-
-
- with open(path1,"a") as file2: # open必须连着 with open ?
- file2.write("新增一句")
- file2.write("\n")
write()
写入的内容是一个字符串,如果不是,则需要提前转换。VBA
python
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。