<p>好的,下面是一个基于您的代码的解决方案,它适用于您的<code>.txt</code>文件的格式:</p>
<pre><code>import csv
# Define data_type / dict1 / dict2:
data_type = [
"M", "E", "B", "A", "DF", "DW", "DL", "DT", "PF", "PW", "PL", "PT",
"XTEXT", "MDEDATA", "X8DATA", "X16DATA", "X32DATA", "X64DATA",
"X128DATA", "X256DATA", "X512DATA", "X1024DATA", "X2048DATA",
"X4096DATA", "X8912DATA"]
dict1 = {
"M": 1, "E": 2, "A": 3, "DF": 4, "DW": 5, "DL": 6, "DT": 7, "PF": 8,
"PW": 9, "B": 10, "PL": 11, "PT": 12, "XTEXT": 4105, "MDEDATA": 4110,
"X8DATA": 10000, "X16DATA": 10001, "X32DATA": 10002, "X64DATA": 10003,
"X128DATA": 10004, "X256DATA": 10005, "X512DATA": 10006,
"X1024DATA": 10007, "X2048DATA": 10008, "X4096DATA": 10009,
"X8912DATA": 10010}
dict2 = {
"M": "B", "E": "B", "A": "B", "DF": ">f","PF": ">f", "DW": ">h",
"PW": ">h", "DL": ">l", "PL": ">l", "DT": "String", "PT": "String",
"B": "B", "XTEXT": "XTEXT", "MDEDATA": "MDEDATA", "X8DATA": "X8DATA",
"X16DATA": "X16DATA", "X32DATA": "X32DATA", "X64DATA": "X64DATA",
"X128DATA": "X128DATA", "X256DATA": "X256DATA", "X512DATA": "X512DATA",
"X1024DATA": "X1024DATA", "X2048DATA": "X2048DATA",
"X4096DATA": "X4096DATA", "X8912DATA": "X8912DATA"}
# Obtain writer for output file:
source = 'GSV.txt'
dest = open('GSV_copy.txt', 'w')
# Process data:
import re
source_lines = open(source).readlines()
for line in source_lines:
x = line.split(';')[1]
icon_lletter = ''
icon_lnummer = 0
python_letter = ''
for t in data_type:
if x.startswith(t): # Alternative using re: "if re.match(t, x)"
icon_lletter = t
break
if (icon_lletter not in dict1):
print "Entry (%s) in Dictionary1 is not available" % (icon_lletter)
else:
icon_lnummer = dict1[icon_lletter]
if (icon_lletter not in dict2):
print "Entry (%s) in Dictionary2 is not available" % (icon_lletter)
else:
python_letter = dict2[icon_lletter]
print "Converted the GVR datatype to python datatype is %s : %s : %s" \
% (icon_lletter, python_letter, icon_lnummer)
# Write line to output file:
dest.write(';'.join([line.strip('\n'), str(icon_lnummer) + '\n']))
dest.close()
</code></pre>
<p><strong>请注意:</strong></p>
<ul>
<li><p>有了这个解决方案,我试图解决您的问题,同时保持接近您的原始实现。实现目标的方法有很多种,可能更像Python式的/高效的/干燥的。</p></li>
<li><p>由于输入和输出文件的列数不同,格式也不同,因此您最终会希望将代码转换为一个(一组)函数,该函数将不同的内容(要检查的文件类型和列)作为参数。</p></li>
</ul>
<hr/>
<p><strong>编辑:</strong></p>
<p>在这个问题上,我发现<code>dest</code>中的输出有点混乱。(我之前还没到那么远:))我已经更改了代码,以产生您现在想要的精确输出。在</p>
<hr/>
<p><strong>另一个编辑</strong>(基于评论中的讨论):</p>
<p>关于将输入文件中的数据类型与已定义的<code>data_type</code>列表相匹配的主题:如果输入文件中的<code>DT</code>总是在开头或结尾使用您不想考虑的数字,则可以使用</p>
^{pr2}$
<p>或者</p>
<pre><code>re.sub('[0-9]+$', '', x)
</code></pre>
<p>移除它们。在</p>