Python - 将 dbf 写入 txt,文本文件不完整
Python - writing dbf to txt, text file incomplete
我正在 Python 中编写一个脚本来自动化 GIS 过程。大致流程如下:
- 设置初始参数
- 建立数据库连接
- 运行 一个 ArcGIS 模型
- 将结果 table 转换为
.dbf
- 将
.dbf
转换为 .txt
文件
- 重新格式化
.txt
文件中的内容
- 最后将 headers 添加到
.txt
文件。
在大多数情况下,该过程运行良好。我遇到的问题是 .txt
文件不完整。 ArcGIS 模型生成的 .dbf
有 7304 条记录,但 .txt
文件只有 7232 条记录。几乎就好像在编写 .txt
文件时,脚本在到达结尾之前就放弃了。我似乎无法弄清楚是什么导致了这种情况发生。
我将附上脚本的一部分以及 .txt
文件输出。任何 help/suggestions 将不胜感激。
DBF = r'Q:\GIS_Mapping\BillingDept\ERU\DO_NOT_TOUCH\ReportOutput\ERU.dbf'
output_directory = r'Q:\GIS_Mapping\BillingDept\ERU\DO_NOT_TOUCH\ERU_Output'
ERU_file = os.path.join(output_directory,'ERU.txt')
arcpy.AddMessage('Creating ERU file')
print "3"
report = open(ERU_file, "w")
cursor = arcpy.SearchCursor(DBF)
for row in cursor:
ACCT = row.getValue('ACCT')
STR_ACCT = str(ACCT)
NEW_ACCT = STR_ACCT.replace('.0','')
IMPAREA = row.getValue('IMPAREA')
STR_IMPAREA = str(IMPAREA)
NEW_IMPAREA = STR_IMPAREA.replace(".0",".00")
SWCODE = row.getValue('SWCODE')
STR_SWCODE = str(SWCODE)
report.write(NEW_ACCT + "," + NEW_IMPAREA + "," + STR_SWCODE + '\n')
del (ERU_file)
print "4"
arcpy.AddMessage('Adding headers')
headers = ['"ACCT","IMPAREA","SWCODE"']
filename = r"Q:\GIS_Mapping\BillingDept\ERU\DO_NOT_TOUCH\ERU_Output\ERU.txt"
tmp = open('TMP', 'w')
orig = open(filename, 'r')
tmp.write('\t'.join(headers) + '\n')
for line in orig.readlines():
tmp.write(line)
orig.close()
tmp.close()
arcpy.AddMessage('Headers added, renaming file')
os.remove(r'Q:\GIS_Mapping\BillingDept\ERU\DO_NOT_TOUCH\ERU_Final\ERU.txt')
os.rename('TMP', r'Q:\GIS_Mapping\BillingDept\ERU\DO_NOT_TOUCH\ERU_Final\ERU.txt')
print "5"
os.startfile(r'Q:\GIS_Mapping\BillingDept\ERU\DO_NOT_TOUCH\ERU_Final\ERU.txt')
arcpy.AddMessage('Done')
下面是 .txt
输出的一部分,没有 headers。如您所见,该过程 运行ning 正常,然后在 222415613,0.00
.
后停止
600414006,0.00,1
602311015,0.00,1
910010858,0.00,1
2000716007,0.00,1
220735804,0.00,1
910010076,0.00,1
300724505,0.00,1
910012468,0.00,1
303737006,0.00,1
503143201,10079.33,2
213001881,0.00,1
2007212003,0.00,1
4080010042,0.00,1
4030010111,0.00,1
4090020013,0.00,1
910011618,0.00,1
221624400,0.00,1
600934006,0.00,1
505531404,0.00,1
215232207,0.00,1
600432514,0.00,1
600432011,0.00,0
404834003,0.00,1
222415613,0.00
附件是 .dbf
的屏幕截图。如您所见,在 222415613
条记录之后,信息继续正常显示大约另外 50 条左右的记录。
将 del (ERU_file)
更改为 report.close()
。 del (ERU_file)
只是删除标识文件位置的字符串,实际上并没有关闭打开的文件句柄并将数据刷新到磁盘。
或者更好的是,使用 with
statement:
改变
report = open(ERU_file, 'w')
到
with open(ERU_file, 'w') as report:
并在 cursor
声明和 for
循环中添加一个缩进级别。
发生的情况是,您正在打开文件的第二个副本 orig = open(filename, 'r')
,而第一个副本 report
仍在打开,数据仍在写入缓冲区中,而不是刷新到磁盘。当脚本完成 运行 时,该数据作为 python 清理的一部分刷新到磁盘,这就是为什么您自己查看时会在文件中看到它的原因。
我正在 Python 中编写一个脚本来自动化 GIS 过程。大致流程如下:
- 设置初始参数
- 建立数据库连接
- 运行 一个 ArcGIS 模型
- 将结果 table 转换为
.dbf
- 将
.dbf
转换为.txt
文件 - 重新格式化
.txt
文件中的内容 - 最后将 headers 添加到
.txt
文件。
在大多数情况下,该过程运行良好。我遇到的问题是 .txt
文件不完整。 ArcGIS 模型生成的 .dbf
有 7304 条记录,但 .txt
文件只有 7232 条记录。几乎就好像在编写 .txt
文件时,脚本在到达结尾之前就放弃了。我似乎无法弄清楚是什么导致了这种情况发生。
我将附上脚本的一部分以及 .txt
文件输出。任何 help/suggestions 将不胜感激。
DBF = r'Q:\GIS_Mapping\BillingDept\ERU\DO_NOT_TOUCH\ReportOutput\ERU.dbf'
output_directory = r'Q:\GIS_Mapping\BillingDept\ERU\DO_NOT_TOUCH\ERU_Output'
ERU_file = os.path.join(output_directory,'ERU.txt')
arcpy.AddMessage('Creating ERU file')
print "3"
report = open(ERU_file, "w")
cursor = arcpy.SearchCursor(DBF)
for row in cursor:
ACCT = row.getValue('ACCT')
STR_ACCT = str(ACCT)
NEW_ACCT = STR_ACCT.replace('.0','')
IMPAREA = row.getValue('IMPAREA')
STR_IMPAREA = str(IMPAREA)
NEW_IMPAREA = STR_IMPAREA.replace(".0",".00")
SWCODE = row.getValue('SWCODE')
STR_SWCODE = str(SWCODE)
report.write(NEW_ACCT + "," + NEW_IMPAREA + "," + STR_SWCODE + '\n')
del (ERU_file)
print "4"
arcpy.AddMessage('Adding headers')
headers = ['"ACCT","IMPAREA","SWCODE"']
filename = r"Q:\GIS_Mapping\BillingDept\ERU\DO_NOT_TOUCH\ERU_Output\ERU.txt"
tmp = open('TMP', 'w')
orig = open(filename, 'r')
tmp.write('\t'.join(headers) + '\n')
for line in orig.readlines():
tmp.write(line)
orig.close()
tmp.close()
arcpy.AddMessage('Headers added, renaming file')
os.remove(r'Q:\GIS_Mapping\BillingDept\ERU\DO_NOT_TOUCH\ERU_Final\ERU.txt')
os.rename('TMP', r'Q:\GIS_Mapping\BillingDept\ERU\DO_NOT_TOUCH\ERU_Final\ERU.txt')
print "5"
os.startfile(r'Q:\GIS_Mapping\BillingDept\ERU\DO_NOT_TOUCH\ERU_Final\ERU.txt')
arcpy.AddMessage('Done')
下面是 .txt
输出的一部分,没有 headers。如您所见,该过程 运行ning 正常,然后在 222415613,0.00
.
600414006,0.00,1
602311015,0.00,1
910010858,0.00,1
2000716007,0.00,1
220735804,0.00,1
910010076,0.00,1
300724505,0.00,1
910012468,0.00,1
303737006,0.00,1
503143201,10079.33,2
213001881,0.00,1
2007212003,0.00,1
4080010042,0.00,1
4030010111,0.00,1
4090020013,0.00,1
910011618,0.00,1
221624400,0.00,1
600934006,0.00,1
505531404,0.00,1
215232207,0.00,1
600432514,0.00,1
600432011,0.00,0
404834003,0.00,1
222415613,0.00
附件是 .dbf
的屏幕截图。如您所见,在 222415613
条记录之后,信息继续正常显示大约另外 50 条左右的记录。
将 del (ERU_file)
更改为 report.close()
。 del (ERU_file)
只是删除标识文件位置的字符串,实际上并没有关闭打开的文件句柄并将数据刷新到磁盘。
或者更好的是,使用 with
statement:
改变
report = open(ERU_file, 'w')
到
with open(ERU_file, 'w') as report:
并在 cursor
声明和 for
循环中添加一个缩进级别。
发生的情况是,您正在打开文件的第二个副本 orig = open(filename, 'r')
,而第一个副本 report
仍在打开,数据仍在写入缓冲区中,而不是刷新到磁盘。当脚本完成 运行 时,该数据作为 python 清理的一部分刷新到磁盘,这就是为什么您自己查看时会在文件中看到它的原因。