<p dir="auto">Just using the existing configuration framework, but with a file format like matplotlib uses... See how they do it here: <a href="http://matplotlib.org/users/customizing.html" rel="nofollow">http://matplotlib.org/users/customizing.html</a>.</p>
<p dir="auto">Plus, we can document all the config options in a single file.</p>
<p dir="auto">related <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="9104798" data-permission-text="Title is private" data-url="https://github.com/pandas-dev/pandas/issues/2452" data-hovercard-type="issue" data-hovercard-url="/pandas-dev/pandas/issues/2452/hovercard" href="https://github.com/pandas-dev/pandas/issues/2452">#2452</a>, <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="12003435" data-permission-text="Title is private" data-url="https://github.com/pandas-dev/pandas/issues/3046" data-hovercard-type="issue" data-hovercard-url="/pandas-dev/pandas/issues/3046/hovercard" href="https://github.com/pandas-dev/pandas/issues/3046">#3046</a></p>
<p dir="auto">Tested on 0.13.0, 0.13.1 and 0.14.0rc1:</p>
<div class="highlight highlight-source-python notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="from StringIO import StringIO
import pandas as pd

# this is correct
print(pd.DataFrame([[0, 1, 2], [3, 4, 5]], columns=[&quot;a&quot;, &quot;b&quot;, &quot;a&quot;]))
# and this is fine as well
# (although, changing the column names to a,b,a.1)
print(pd.read_csv(StringIO(&quot;a,b,a\n0,1,2\n3,4,5&quot;)))
# but this is not correct
print(pd.read_csv(StringIO(&quot;0,1,2\n3,4,5&quot;), names=[&quot;a&quot;, &quot;b&quot;, &quot;a&quot;]))"><pre class="notranslate"><span class="pl-k">from</span> <span class="pl-v">StringIO</span> <span class="pl-k">import</span> <span class="pl-v">StringIO</span>
<span class="pl-k">import</span> <span class="pl-s1">pandas</span> <span class="pl-k">as</span> <span class="pl-s1">pd</span>

<span class="pl-c"># this is correct</span>
<span class="pl-en">print</span>(<span class="pl-s1">pd</span>.<span class="pl-v">DataFrame</span>([[<span class="pl-c1">0</span>, <span class="pl-c1">1</span>, <span class="pl-c1">2</span>], [<span class="pl-c1">3</span>, <span class="pl-c1">4</span>, <span class="pl-c1">5</span>]], <span class="pl-s1">columns</span><span class="pl-c1">=</span>[<span class="pl-s">"a"</span>, <span class="pl-s">"b"</span>, <span class="pl-s">"a"</span>]))
<span class="pl-c"># and this is fine as well</span>
<span class="pl-c"># (although, changing the column names to a,b,a.1)</span>
<span class="pl-en">print</span>(<span class="pl-s1">pd</span>.<span class="pl-en">read_csv</span>(<span class="pl-v">StringIO</span>(<span class="pl-s">"a,b,a<span class="pl-cce">\n</span>0,1,2<span class="pl-cce">\n</span>3,4,5"</span>)))
<span class="pl-c"># but this is not correct</span>
<span class="pl-en">print</span>(<span class="pl-s1">pd</span>.<span class="pl-en">read_csv</span>(<span class="pl-v">StringIO</span>(<span class="pl-s">"0,1,2<span class="pl-cce">\n</span>3,4,5"</span>), <span class="pl-s1">names</span><span class="pl-c1">=</span>[<span class="pl-s">"a"</span>, <span class="pl-s">"b"</span>, <span class="pl-s">"a"</span>]))</pre></div>
<p dir="auto">The last one returns:</p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="Out[5]: 
   a  b  a
0  2  1  2
1  5  4  5"><pre class="notranslate"><code class="notranslate">Out[5]: 
   a  b  a
0  2  1  2
1  5  4  5
</code></pre></div>
<p dir="auto">I would expect all 3 methods to return the same DataFrame. I noticed this when I wanted to read csv file that had a separate file with a header (and a duplicated column in it). BTW is there a better way to do it than to read the header file first and pass the output into 'names' parameter of read_csv?</p>